powershell作业不是并行执行的

时间:2018-06-07 18:22:43

标签: 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"  

1 个答案:

答案 0 :(得分:5)

核心并不重要,您可以并行运行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秒休息?

并行运行的工作越多 - 越糟糕。 在10秒睡眠时开始100个工作(所以在所有工作开始之前首先没有完成)只挂PS窗口并且从未完成......这很奇怪,因为我使用了数百个工作,每个工作需要10秒以上才能完成从来没有遇到过这样的问题。

这需要进一步测试不同的机器(可能是os /处理器/防病毒?)和不同的PowerShell版本。

我也认为这可能是启动睡眠功能特有的但是没有 - 使用不同的方法让它运行几秒钟但效果仍然相同。  必须检查它因为我使用powershell作业(主要是invoke-command -asjob) 每天如果这样保持这样 - 我可能需要考虑切换到运行空间或工作流程以满足我的并行处理需求......