Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
powershell';每个线程最多使用5个线程?_Powershell_Parallel For_Powershell Workflow - Fatal编程技术网

powershell';每个线程最多使用5个线程?

powershell';每个线程最多使用5个线程?,powershell,parallel-for,powershell-workflow,Powershell,Parallel For,Powershell Workflow,foreach-parallel的throttlelimit参数可以控制执行脚本时使用的进程数。但即使我将throttlelimit设置为大于5,也不能有超过5个进程 该脚本在多个powershell进程中执行。所以我检查脚本中的PID。然后对PID进行分组,这样我就可以知道有多少进程用于执行脚本 function GetPID() { $PID } workflow TestWorkflow { param($throttlelimit) foreach -paral

foreach-parallel
throttlelimit
参数可以控制执行脚本时使用的进程数。但即使我将
throttlelimit
设置为大于5,也不能有超过5个进程

该脚本在多个powershell进程中执行。所以我检查脚本中的PID。然后对PID进行分组,这样我就可以知道有多少进程用于执行脚本

function GetPID() {
    $PID
}

workflow TestWorkflow {
    param($throttlelimit)
    foreach -parallel -throttlelimit $throttlelimit ($i in 1..100) {
        GetPID
    }
}

foreach ($i in 1..8) {
    $pids = TestWorkflow -throttlelimit $i
    $measure = $pids | group | Measure-Object
    $measure.Count
}
输出是

1
2
3
4
5
5
5
5
对于
$i
小于或等于5,我有
$i
进程。但是对于大于5的
$i
,我只有5个进程。在执行脚本时,有没有办法增加进程的数量

编辑:为了回应@SomeShinyObject的回答,我添加了另一个测试用例。这是对@SomeShinyObject给出的示例的修改。我添加了一个函数
S
,它除了睡眠10秒之外什么也不做

function S($n) {
    $s = Get-Date
    $s.ToString("HH:mm:ss.ffff") + " start sleep " + $n
    sleep 10
    $e = Get-Date
    $e.ToString("HH:mm:ss.ffff") + " end sleep " + $n + " diff " + (($e-$s).TotalMilliseconds)
}

Workflow Throttle-Me {
    [cmdletbinding()]
    param (
        [int]$ThrottleLimit = 10,
        [int]$CollectionLimit = 10
    )

    foreach -parallel -throttlelimit $ThrottleLimit ($n in 1..$CollectionLimit){
        $s = Get-Date
        $s.ToString("HH:mm:ss.ffff") + " start " + $n
        S $n
        $e = Get-Date
        $e.ToString("HH:mm:ss.ffff") + " end " + $n + " diff " + (($e-$s).TotalMilliseconds)
    }
}

Throttle-Me -ThrottleLimit 10 -CollectionLimit 20
这是输出。我按时间(秒数)对输出进行分组,并在每组中重新排序以使其更清晰。很明显,函数
s
是5乘5调用的,尽管我将
throttlelimit
设置为10(首先我们有
开始睡眠6..10
,10秒后,我们有
开始睡眠1..5
,10秒后
开始睡眠11..15
,10秒后
开始睡眠16..20


我不能支持那个特定的cmdlet,但正如您所发现的那样,PowerShell每个PID只使用一个线程。解决这个问题的常见方法是和。运行空间比psjob更难,但它们的性能也明显更好,这使得它们成为流行的选择。缺点是,您的整个代码都必须围绕它们进行解析,这意味着在大多数情况下需要进行整个重写


不幸的是,尽管微软推出了PowerShell,但它并不是为性能和速度而设计的。但是,当它与.NET绑定时,它会尽可能好地运行。我相信您的测试有点缺陷。据此,
$PID
不是脚本工作流中可用的变量

关于这一点,可以找到更好的测试和解释

基本上,
ThrottleLimit
设置为理论上的
[Int32]::MaxValue
。海报还设计了一个更好的测试来检查并行处理(稍作修改):


这是指确实允许并行处理的PowerShell工作流。我对你的例子做了一点修改,并把它放在我的问题中。我在字符串输出的中间添加了一个函数。似乎无论如何设置I
throttlelimit
,函数都是5乘5调用的。我对我的问题也做了一些解释,当我在并行foreach块中从with调用函数时,我看到了相同的行为。油门限制有效地限制在5。非常奇怪。顺便说一下:Windows PowerShell工作流是在v3中引入的,但从未真正流行起来。考虑到它们是,未来所有的开发工作都将去哪里,我认为称之为过时的技术是公平的。
03:40:29.7147 start 10
03:40:29.7304 start 9
03:40:29.7304 start 8
03:40:29.7459 start 7
03:40:29.7459 start 6
03:40:29.7616 start 5
03:40:29.7772 start 4
03:40:29.7772 start 3
03:40:29.7928 start 2
03:40:29.7928 start 1

03:40:35.3067 start sleep 7
03:40:35.3067 start sleep 8
03:40:35.3067 start sleep 9
03:40:35.3692 start sleep 10
03:40:35.4629 start sleep 6

03:40:45.3292 end sleep 7 diff 10022.5353
03:40:45.3292 end sleep 8 diff 10022.5353
03:40:45.3292 end sleep 9 diff 10022.5353
03:40:45.3761 end sleep 10 diff 10006.8765
03:40:45.4855 end sleep 6 diff 10022.5243
03:40:45.3605 end 9 diff 15630.1005
03:40:45.3917 end 7 diff 15645.7465
03:40:45.3917 end 8 diff 15661.3313
03:40:45.4229 end 10 diff 15708.2274
03:40:45.5323 end 6 diff 15786.3969
03:40:45.4386 start sleep 5
03:40:45.4542 start sleep 4
03:40:45.4542 start sleep 3
03:40:45.4698 start sleep 2
03:40:45.5636 start sleep 1
03:40:45.4698 start 11
03:40:45.4855 start 12
03:40:45.5011 start 13
03:40:45.5167 start 14
03:40:45.6105 start 15

03:40:55.4596 end sleep 3 diff 10005.4374
03:40:55.4596 end sleep 4 diff 10005.4374
03:40:55.4596 end sleep 5 diff 10021.0426
03:40:55.4752 end sleep 2 diff 10005.3992
03:40:55.5690 end sleep 1 diff 10005.3784
03:40:55.4752 end 3 diff 25698.0221
03:40:55.4909 end 5 diff 25729.302
03:40:55.5065 end 4 diff 25729.2523
03:40:55.5221 end 2 diff 25729.2559
03:40:55.6159 end 1 diff 25823.032
03:40:55.5534 start sleep 11
03:40:55.5534 start sleep 12
03:40:55.5690 start sleep 13
03:40:55.5846 start sleep 14
03:40:55.6784 start sleep 15
03:40:55.6002 start 16
03:40:55.6002 start 17
03:40:55.6159 start 18
03:40:55.6326 start 19
03:40:55.7096 start 20

03:41:05.5692 end sleep 11 diff 10015.8226
03:41:05.5692 end sleep 12 diff 10015.8226
03:41:05.5848 end sleep 13 diff 10015.8108
03:41:05.6004 end sleep 14 diff 10015.8128
03:41:05.6942 end sleep 15 diff 10015.8205
03:41:05.5848 end 12 diff 20099.3218
03:41:05.6004 end 11 diff 20130.5719
03:41:05.6161 end 13 diff 20114.9729
03:41:05.6473 end 14 diff 20130.5962
03:41:05.6942 end 15 diff 20083.7506
03:41:05.6317 start sleep 17
03:41:05.6317 start sleep 16
03:41:05.6473 start sleep 18
03:41:05.6629 start sleep 19
03:41:05.7411 start sleep 20

03:41:15.6320 end sleep 16 diff 10000.3608
03:41:15.6320 end sleep 17 diff 10000.3608
03:41:15.6477 end sleep 18 diff 10000.3727
03:41:15.6633 end sleep 19 diff 10000.3709
03:41:15.7414 end sleep 20 diff 10000.3546
03:41:15.6477 end 16 diff 20047.4375
03:41:15.6477 end 17 diff 20047.4375
03:41:15.6633 end 18 diff 20047.4295
03:41:15.7101 end 19 diff 20077.5169
03:41:15.7414 end 20 diff 20031.7909
Workflow Throttle-Me {
    [cmdletbinding()]
    param (
        [int]$ThrottleLimit = 10,
        [int]$CollectionLimit = 10
    )

    foreach -parallel -throttlelimit $ThrottleLimit ($n in 1..$CollectionLimit){
        "Working on $n"
        "{0:hh}:{0:mm}:{0:ss}" -f (Get-Date)
    }
}