2012-09-25 11 views
5

Sto clonando le VM sul server ESX dal modello. Il codice semplificato si presenta così:Powershell 3.0 - Flussi di lavoro - Numero limite di esecuzione parallela

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

Create-VM 

L'esecuzione parallela è davvero utile. Sfortunatamente in questo caso non funziona abbastanza bene. Sono state generate troppe richieste parallele. Devo limitare il numero di esecuzione parallela a un numero più piccolo (ad esempio 4).

Stavo cercando di modificare la configurazione della sessione locale (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 

Domanda

  • Quale parametro (o combinazione) di Session Configuration dovrei cambiare, al fine di limitare il numero di esecuzione parallela a 4?
  • C'è qualche altro metodo come posso ottenerlo (ad esempio: un modo diverso di eseguire il flusso di lavoro ...)?

risposta

3

Una soluzione banale consiste nel dividere l'elenco in blocchi più piccoli e utilizzarlo come input foreach parallelo. In questo modo,

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

Grazie, funziona bene. – Starspace

9

C'è un'opzione per limitare il numero di processi paralleli in un ciclo foreach-parallelo usando -throttlelimit N. È ottimo per ridurre il parallelismo, ma se provi un numero elevato il sistema potrebbe comunque limitarti a 5, a seconda di tutte le versioni del tuo software (YAY! Microsoft coerenza). So che la questione è vecchio, ma da quando è venuto su Google senza una risposta decente, ho pensato di carillon.

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

Create-VM 
0

Volevo solo aggiungere questo dettaglio, interruttore ThrottleLimit di cui sopra è disponibile in PowerShell v4 .0, non è disponibile nella versione 3.0. Abbiamo un mix di server 2.0 e 3.0

+0

v3 è particolarmente negativo, perché anche se ha un limite di 5 flussi di lavoro, non ne riutilizza nessuno finché non ha * tutto * completato. Quindi funziona davvero solo in gruppi di 5. AFAIK questa stessa limitazione non esiste in v4. tl; dr probabilmente non usa i flussi di lavoro in v3. –

Problemi correlati