Powershell Jobs没有回归我的期望

时间:2018-02-24 23:14:43

标签: multithreading powershell parallel-processing jobs start-job

我有这个PowerShell脚本,它从文件中读取整数行,并使用$ CHUNK_SIZE行数创建一个新作业,以获得所有素数的总和,直到文件结束。 $ MAX_THREADS是帽子可以同时运行的工作量,我正在测试1,但稍后会更改为2,4和8。我等待所有作业完成,然后从作业中接收所有小计,以获得文件中所有素数的实际总和。我的问题是最后的累计总数应该是2844292,但我一直得到2766271.我已经检查了我的主要功能,是什么从文件中读取并被发送到工作 - 但它们似乎不是问题。当我查看我的输出时,我注意到我在最后两个工作中连续两次收到相同的值。我不知道为什么会发生这种情况。 这些照片显示了我的输出:

1。Get-Job Info

2。What I get back from Receive-Job and my total increasing

任何关于为什么我的总计已经关闭的帮助将不胜感激!谢谢!

Set-StrictMode -Version latest

$CHUNK_SIZE = 1024
$MAX_THREADS = 1


$scriptBlock = {
    param($chunkArr)

    function isPrime([int]$data){
        if($data -lt 2){return $FALSE}
        if($data -eq 2){return $TRUE}
        if($data % 2 -eq 0){return $FALSE}
        for($i=3;$i*$i-le$data;$i+=2){
            if($data % $i -eq 0){return $FALSE}
        }
        return $TRUE
    } 

    $total = 0
    foreach($line in $chunkArr){
        $data = [int]$line
        if(isPrime $data){
            $total += $data
        }
    }
    $total 
}

$eof = $FALSE
$reader = New-Object System.IO.StreamReader("$PWD/ass2-20000.txt")
$chunkArr = New-Object System.Collections.ArrayList
while(!$eof){
    $chunkArr.Clear()
    for($i=0;$i -lt $CHUNK_SIZE;$i++){
        $line = $reader.ReadLine()
        if($line -eq $NULL){
            $eof = $TRUE
            break
        }
        $chunkArr.add($line) | Out-Null
    }
    While(@(Get-Job -state running).count -ge $MAX_THREADS){
        Start-Sleep -Seconds .2
    }
    Start-Job -ArgumentList (,$chunkArr) -ScriptBlock $scriptBlock
}

While(@(Get-Job -state running).count -ge 1){
    Start-Sleep -Seconds .2
}
Get-Job
$total = 0

foreach($job in Get-Job){
    $tmp = Receive-job $job
    Write-Output ("Recieved: " + $tmp)
    $total += $tmp
    Write-Output ("Total: " + $total)
    Remove-Job $job
}

$reader.Close()
$total

编辑:这个image显示了应该返回的工作,最后一行显示正确的总数。似乎我的第一份工作从未被收到而我的最后一份工作正在接收两次

编辑:将What I should be getting from each JobWhat I actually get

进行比较

0 个答案:

没有答案