2012-09-25 18 views
5

Klonuję maszyny wirtualne na serwerze ESX z szablonu. Uproszczony kod wygląda następująco:Powershell 3.0 - Przepływy pracy - Ogranicz liczbę równoległych operacji

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

Create-VM 

Równoległe wykonanie jest naprawdę pomocne. Niestety w tym przypadku nie działa całkiem dobrze. Wygenerowano zbyt wiele równoległych żądań. Muszę ograniczyć liczbę równoległych wykonań do mniejszej liczby (na przykład 4).

Próbowałem zmienić lokalną konfigurację sesji (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 

Pytanie

  • który parametr (lub ich kombinacji) konfiguracji sesji należy zmienić, aby ograniczyć liczbę egzekucji równoległej do 4?
  • Czy istnieje inna metoda, w jaki sposób mogę to osiągnąć (Na przykład: inny sposób wykonania przepływu pracy ...)?

Odpowiedz

3

Rozwiązaniem banalnym jest podzielenie listy na mniejsze części i użycie jej jako danych wejściowych dla foreach równoległych. Podobnie jak,

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

Dziękuję, działa dobrze. – Starspace

9

Istnieje możliwość, aby ograniczyć liczbę równoległych procesach w pętli foreach równoległe pomocą -throttlelimit N. Jest świetny w zmniejszaniu paralelizmu, ale jeśli wypróbujesz dużą liczbę, system może ograniczyć Cię do 5, w zależności od wszystkich twoich wersji oprogramowania (zgodność YAY! Microsoft). Wiem, że pytanie jest stary, ale ponieważ pojawił się w Google bez godnej odpowiedzi, myślałem, że kurant.

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

Create-VM 
0

Chciałem tylko dodać ten szczegół, przełącznik ThrottleLimit wspomniano powyżej jest dostępna w PowerShell v4 .0, nie jest dostępny w wersji 3.0. Mamy połączenie serwerów 2.0 i 3.0.

+0

v3 jest szczególnie szkodliwy, ponieważ nawet jeśli ma limit 5 przepływów pracy, nie użyje ponownie żadnego z nich, dopóki nie zostaną zakończone * wszystkie *. Tak naprawdę działa tylko w partiach po 5. AFAIK to samo ograniczenie nie istnieje w wersji 4. tl; dr prawdopodobnie nie używa workflows w v3. –

Powiązane problemy