我有一个看起来像这样的PowerShell工作流,除了每个Foo函数通常做的非常不同:
function Foo1
{
"Foo1 : {0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
Start-Sleep 2
}
function Foo2
{
"Foo2 : {0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
Start-Sleep 2
}
function Foo3
{
"Foo3 : {0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
Start-Sleep 2
}
function Foo4
{
"Foo4 : {0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
Start-Sleep 2
}
function Foo5
{
"Foo5 : {0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
Start-Sleep 2
}
function Foo6
{
"Foo6 : {0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
Start-Sleep 2
}
workflow Invoke-Workflow
{
parallel
{
Foo1
Foo2
Foo3
Foo4
Foo5
Foo6
}
}
Invoke-Workflow
这个输出是:
Foo1:10:28:43
Foo2:10:28:43
Foo3:10:28:44
Foo5:10:28:44
Foo4:10:28:44
Foo6:10:28:46
显示前5个立即运行,然后第6个项目必须等待前一个项目之一完成。
我看到很多文档显示如何增加foreach循环中的并行执行次数。但是,如何增加并行块中运行的项目数?
答案 0 :(得分:1)
似乎没有办法增加将在并行块中使用的线程数,或者如果存在,则很难找到。解决方法是使用Start-Job命令。你可以使用
Start-Job -Scriptblock {#do stuff here}
或者,如果代码的内容多于您想要的内联代码,则可以让它运行脚本:
Start-Job -Filepath "c:\temp\job.ps1" -ArgumentList 1
每个作业都需要一些时间才能启动,因此它们不会同时启动。我运行了一个循环来运行Start-Job命令并记录它们开始的时间。每个作业都有30秒的睡眠时间,因此它不会立即死亡(并尝试强制运行的作业数量达到线程的极限)。结果有所不同,但最多20次测试表明它能够同时运行至少。在下面的结果中,有些是在第一次开始后28秒开始的,但请记住,由于30秒睡眠,第一批仍在运行。所以他们并没有全部开始快速射击,但是同时有20个跑步。
#1 started at 5/29/2015 2:17:25 PM
#2 started at 5/29/2015 2:17:25 PM
#3 started at 5/29/2015 2:17:26 PM
#4 started at 5/29/2015 2:17:26 PM
#5 started at 5/29/2015 2:17:27 PM
#7 started at 5/29/2015 2:17:28 PM
#6 started at 5/29/2015 2:17:28 PM
#8 started at 5/29/2015 2:17:31 PM
#9 started at 5/29/2015 2:17:37 PM
#10 started at 5/29/2015 2:17:47 PM
#12 started at 5/29/2015 2:17:53 PM
#13 started at 5/29/2015 2:17:53 PM
#15 started at 5/29/2015 2:17:53 PM
#18 started at 5/29/2015 2:17:53 PM
#11 started at 5/29/2015 2:17:53 PM
#20 started at 5/29/2015 2:17:53 PM
#14 started at 5/29/2015 2:17:53 PM
#16 started at 5/29/2015 2:17:53 PM
#17 started at 5/29/2015 2:17:53 PM
#19 started at 5/29/2015 2:17:53 PM
我确实遇到过其他几种使用PowerShell进行多线程处理的方法,但这是最容易理解和演示的方法。这可能不是最好的。