2015-11-03 55 views
1

我在Powershell中發現並行計算,但有些東西我不明白。即使我使用的是RunspacePool,我的任務輸出也會按順序顯示。看看下面的代碼:RunspacePool的使用顯示順序輸出

Param(
    [int]$MaxJobs = 3 
) 


Begin { 
    $Jobs = @() 
    $JobQueue = [System.Collections.Queue]::Synchronized(
     (New-Object System.Collections.Queue) 
    ) 

    if ($MaxJobs -lt 0) { 
     $MaxJobs = 1 
    } 
    if ($MaxJobs -eq 0) { 
     $MaxJobs = 50 
    } 

    $JobPool = [RunspaceFactory]::CreateRunspacePool(1, $MaxJobs) 
    $JobPool.Open() 
} 


Process { 
    for ($i = 0; $i -lt 50; $i++) 
    { 
     $script = '$t = Get-Random -Minimum 1 -Maximum 10; "' + $i + ': $t" | Out-File jobs.out -Append; sleep $t;' 

     $thread = [powershell]::Create() 
     $thread.AddScript($script) | Out-Null 
     $thread.RunspacePool = $JobPool 
     $handle = $thread.BeginInvoke() 

     $j = "" | Select-Object Handle, Thread 
     $j.Handle = $handle 
     $j.Thread = $thread 
     $Jobs += $j 
    } 
} 


End { 
    while (@($Jobs | Where-Object {$_.Handle -ne $Null}).Count -gt 0) { 
     foreach ($j in $($Jobs | Where-Object {$_.Handle.IsCompleted -eq $True})) { 
      $j.Thread.EndInvoke($j.Handle) 
      $j.Thread.Dispose() 
      $j.Thread = $Null 
      $j.Handle = $Null 
     } 
    } 
    $JobPool.Close() | Out-Null 
    $JobPool.Dispose() | Out-Null 
} 

Process塊,給出的隨機睡眠值,我希望該文件以相當隨機也可以寫,但事實並非如此。

0 : 7 
1 : 1 
2 : 1 
3 : 8 
4 : 8 
5 : 2 
6 : 7 
7 : 9 
8 : 9 
9 : 9 
1 0 : 3 
1 1 : 3 
1 2 : 5 
1 3 : 5 
1 4 : 3 
1 5 : 1 
1 6 : 1 
1 7 : 9 
1 8 : 9 
1 9 : 1 
2 0 : 8 
2 1 : 1 
2 2 : 1 
2 3 : 1 
2 4 : 1 
2 5 : 1 
2 6 : 1 
2 7 : 8 
2 8 : 8 
2 9 : 9 
3 0 : 8 
3 1 : 8 
3 2 : 1 
3 3 : 6 
3 4 : 1 
3 5 : 1 
3 6 : 5 
3 7 : 5 
3 8 : 5 
3 9 : 9 
4 0 : 3 
4 1 : 3 
4 2 : 5 
4 3 : 5 
4 4 : 4 
4 5 : 4 
4 6 : 4 
4 7 : 1 
4 8 : 1 
4 9 : 4 

這是正常行爲嗎?

回答

2

快來看看你在運行空間池中運行的報表很好看:

$script = '$t = Get-Random -Minimum 1 -Maximum 10; "' + $i + ': $t" | Out-File jobs.out -Append; sleep $t;' 

,或者很好的格式化的:

$t = Get-Random -Minimum 1 -Maximum 10 
"$i: $t" | Out-File jobs.out -Append 
Sleep $t 

你以前睡覺寫入文件,所以當然,Start-Sleep命令的持續時間不會影響寫入文件的順序。

如果你想看到的睡眠效果,把Out-File聲明最後:

$script = '$t = Get-Random -Minimum 1 -Maximum 10; sleep $t;"' + $i + ': $t" | Out-File jobs.out -Append;' 
+0

你是如此的權利。我錯過了這一點。 – Spack