2012-09-25 35 views
5

我從模板克隆ESX服務器上的虛擬機。簡化的代碼如下所示:Powershell 3.0 - 工作流程 - 限制並行執行的數量

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

一個簡單的解決方案是將列表分成更小的塊並將其用作並行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 .. 
    } 
    } 
} 
+0

謝謝,它運作良好。 – Starspace

9

有限制使用-throttlelimit N的在foreach平行環路並行進程的數量的選項。這對降低並行性很有幫助,但是如果您嘗試使用較高的數字,則系統可能會將您限制爲5個,具體取決於您的所有軟件版本(YAY!Microsoft一致性)。我知道這個問題是舊的,但因爲它提出了在谷歌沒有像樣的答案,我想我會插入內容。

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

Create-VM 
0

只想添加這個細節,上述ThrottleLimit開關是在PowerShell中V4可用.0,它在v3.0中不可用。我們有2.0和3.0服務器的組合

+0

v3特別糟糕,因爲即使它具有5個工作流程的限制,它將不會重複使用它們中的任何一個,直到它們具有* all *完成。所以它只能以5個批次運行。 AFAIK這個相同的限制在v4中不存在。 tl; dr可能不會在v3中使用工作流程。 –