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)
}
}