PowerShell 作业未并行执行



期望它在 5+ 秒内运行(假设我有 4 个内核,每个作业都可以在每个内核上运行(。

$emailTimes =  @(0) * 4  
Write-Host "[$(Get-Date -Format HH:mm:ss.fff)] Starting"  
for ($index=0;$index -lt ($emailTimes.length); $index++) {  
Start-Job -Name "job$index" -ScriptBlock {sleep 5}  
}  
Write-Host "[$(Get-Date -Format HH:mm:ss.fff)] Waiting"  
Get-Job | Wait-Job  
Get-Job | Receive-Job  
Write-Host "[$(Get-Date -Format HH:mm:ss.fff)] Completed"  

内核无关紧要,您可以使用一个内核并行运行 100 个作业。

我现在做的是:

foreach ($i in 1..10 ) { Start-Job -ScriptBlock {SLEEP -Seconds 5} }
MEASURE-COMMAND { Get-Job|Wait-Job }

它以以下方式结束:

TotalSeconds      : 6,2208058

然而 - 运行它几次,一旦我得到:

TotalSeconds      : 14,3781632

所以它可能很慢,但它肯定是并行运行的

我已经开始检查这个,我认为 OP 可能会有所作为。 像这样并行开始了几个工作:

get-job|remove-job
echo "start:"
get-date -UFormat " %H:%M:%S"
1..18| % { 
Start-Job -ScriptBlock {
$obj = ""|select starttime, runtime, finishtime 
$obj.starttime = get-date -UFormat " %H:%M:%S"
$obj.runtime = measure-command {SLEEP -Seconds 1}|select -ExpandProperty totalseconds
$obj.finishtime = get-date -UFormat " %H:%M:%S"
$obj
} |out-null 
} 
echo "finished spinning up jobs at:"
get-date -UFormat " %H:%M:%S"
echo "all jobs finished at "
Get-Job|Wait-Job |out-null
get-date -UFormat " %H:%M:%S"
echo "run time of each job"
get-job|receive-job| ft

结果是这样的 输出:

start:
23:04:27
finished spinning up jobs at:
23:04:31
all jobs finished at
23:05:23
run time of each job
starttime   runtime finishtime
---------   ------- ----------
23:05:07 1,0037849  23:05:08
23:05:07 1,0037791  23:05:08
23:05:22 1,0036025  23:05:23
23:05:22 1,0040943  23:05:23
23:05:22  1,003943  23:05:23
23:05:22 1,0116236  23:05:23
23:05:22 1,0217624  23:05:23
23:05:22 1,0056518  23:05:23
23:05:22 1,0038563  23:05:23
23:05:22 1,0082825  23:05:23
23:05:22 1,0042454  23:05:23
23:05:22 1,0033923  23:05:23
23:05:22 1,0128473  23:05:23
23:05:22 1,0190476  23:05:23
23:05:22 1,0188348  23:05:23
23:05:22 1,0235496  23:05:23
23:05:22 1,0058239  23:05:23
23:05:22 1,0153528  23:05:23

注意到从脚本开始到第一个作业启动有 40 秒的延迟,以及前 2 个和休息之间的 15 秒中断?

并行运行的作业越多 - 情况就越糟糕。 以 100 秒的睡眠启动 10 个作业(因此第一个作业在全部启动之前不会完成(只是挂起 PS 窗口并且从未完成......这很奇怪,因为我使用了数百个作业,每个作业需要 10 秒以上才能完成,以前从未遇到过此类问题。

这需要对不同的机器进行进一步测试(也许是操作系统/处理器/防病毒软件? 和不同的电源外壳版本。

我还认为,也许这是特定于启动-睡眠功能的东西,但没有 - 使用了不同的方法来让它运行几秒钟并且仍然具有相同的效果。 必须检查它,因为我使用powershell作业(主要是调用命令-asjob( 每天,如果这种情况一直这样 - 我可能需要考虑切换到运行空间或工作流以满足我的并行处理需求......

最新更新