Powershell 3.0 - 工作流程 - 限制并行执行次数

时间:2012-09-25 07:16:28

标签: powershell parallel-processing workflow powershell-v3.0

我正在从模板克隆ESX服务器上的VM。简化代码如下所示:

Workflow Create-VM {
  $List = 1..500
  foreach -parallel ($Elem in $List)
  {
      # Create VM ...
      # Configure created VM ..
  }
}

Create-VM

并行执行非常有用。不幸的是,在这种情况下不能很好地工作。生成了太多并行请求。我需要将并行执行次数限制为较小的数字(例如4)。

我正在尝试更改本地会话配置(SessionThrottleLimit,MaxSessionsPerWorkflow,MaxRunningWorkflows)http://technet.microsoft.com/en-us/library/hh849862.aspx

$WWE = New-PSWorkflowExecutionOption  -SessionThrottleLimit 4
Set-PSSessionConfiguration -Name microsoft.powershell.workflow `
   -SessionTypeOption $WWE 
Get-PSSessionConfiguration microsoft.powershell.workflow | 
fl SessionThrottleLimit

问题

  • 我应该更改会话配置的哪个参数(或组合),以便将并行执行的数量限制为4?
  • 是否有其他方法可以实现(例如:执行工作流的不同方式......)?

3 个答案:

答案 0 :(得分:14)

可以选择使用-throttlelimit N限制foreach-parallel循环中的并行进程数。它非常适合降低并行度,但如果您尝试使用较高的数字,系统可能仍会将您限制为5,具体取决于您的所有软件版本(YAY!Microsoft一致性)。我知道这个问题已经很久了,但是因为它没有得到合适的答案而出现在谷歌上,我以为我会加入。

Workflow Create-VM {
  $List = 1..500
  foreach -parallel -throttlelimit 4 ($Elem in $List)
  {
      # Create VM ...
      # Configure created VM ..
  }
}

Create-VM

答案 1 :(得分:3)

一个简单的解决方案是将列表分成更小的块,并将其用作并行foreach的输入。像这样,

Workflow Create-VM {
  $List = 1..500
  # Calclulate indexes to get elements 0,3; 4,7; 8,11 and so on
  # Use the .. operator to extract those elements from $list and pass
  # 'em to foreach -parallel processing part
  for($i=0;$i -le $List.Count-4; $i+=4) { 
    foreach -parallel ($Elem in $list[$i..($i+3)]) {
      # Create VM ...
      # Configure created VM ..
    } 
  }
}

答案 2 :(得分:1)

只是想添加这个细节,上面提到的ThrottleLimit开关在Powershell v4.0中可用,它在v3.0中不可用。我们有2.0和3.0服务器混合