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