PowerShell 工作流线程限制

标签 powershell workflow powershell-4.0

我有一个 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

富二:10:28:43

富 3 : 10:28:44

富 5 : 10:28:44

富 4 : 10:28:44

Foo6 : 10:28:46

显示前 5 个立即运行,然后第 6 个项目必须等待前面的项目之一完成。

我看到很多文档展示了如何增加 foreach 循环中的并行执行次数。但是,如何增加将在并行 block 中运行的项目数?

最佳答案

似乎没有办法增加将在并行 block 中使用的线程数,或者如果有,也很难找到。一种解决方法是使用 Start-Job 命令。您可以使用
Start-Job -Scriptblock {#do stuff here}
或者,如果它的代码多于您想要的内联代码,您可以让它运行一个脚本:
Start-Job -Filepath "c:\temp\job.ps1" -ArgumentList 1
每个作业都需要一些时间来启动,因此它们不会同时启动。我运行了一个循环来运行 Start-Job 命令并记录它们开始的时间。每个作业都有 30 秒的 sleep 时间,这样它就不会立即死亡(并尝试强制运行的作业数量达到线程限制)。结果略有不同,但测试多达 20 个表明它能够运行 至少 这么多同时。在下面的结果中,有些是在第一个之后 28 秒启动的,但请记住,由于 30 秒的 sleep ,第一个仍在运行。所以他们并没有全部开始速射,而是有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 进行多线程处理的方法,但这是最容易理解和演示的。这可能不是最好的。

关于PowerShell 工作流线程限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533050/

相关文章:

powershell - 如何在 PowerShell ISE 中加载配置文件?

.net - 如何使用 IO.File AppendAllLines

workflow - 您推荐哪种工作流引擎?

svn - 使用 Subversion 为 2-3 人的 Web 开发设置完美的工作流程

powershell - 导出当前 DSC 配置以导入到另一台服务器(以 IIS 网站为例)

Powershell 几乎不会使用 install-module 安装任何模块

c# - 工作流的设计模式

powershell - 在文本文件的两列之一中查找重复值

json - 使用PowerShell从SQL Server导出到json文本文件

c# - 在 Powershell 中替换字符串的一部分