PowerShell的工作流线程限制

问题描述:

我有一个PowerShell的工作流程,看起来像这样,除了每个符函数的作用通常有很大的不同:PowerShell的工作流线程限制

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循环中并行执行的次数。但是,如何增加将在并行块中运行的项目数量?

似乎没有办法增加将在并行块中使用的线程数,或者如果有的话,很难找到。解决方法是使用Start-Job命令。您可以使用

Start-Job -Scriptblock {#do stuff here}

或者,如果它是更多的代码比你想拥有在线,你可以把它运行一个脚本:

Start-Job -Filepath "c:\temp\job.ps1" -ArgumentList 1

这需要一些时间,每个作业旋转起来,所以它们并不都是同时开始的。我跑了一个循环来运行开始作业命令并记录他们开始的时间。每个作业都有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多线程运行,但是这是最容易理解和展示。这可能不是最好的。