2012-05-15 14 views
12

Esiste un modo per modificare dinamicamente gli host tra più attività parallele? Questo è quello che ho finora.Host dinamici e attività parallele con libreria Fabric

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     env.hosts.remove(env.host) 

@parallel 
def task_2(): 
    run('uname -s') 

Ovviamente mi manca qualche env paramenters, ma voglio solo task_2 per l'esecuzione su host che soddisfano la condizione in task_1. Appare l'elenco degli host task_2 è inizializzato all'avvio, poiché è in esecuzione su tutti gli host nell'elenco iniziale env.hosts definito in init_hosts(). Ho anche provato a modificare e costruire dinamicamente i roledefs, ma ho avuto lo stesso risultato.

Modifica: esiste anche un modo per impostare una coda di esecuzione parallela in modo che più attività parallele vengano eseguite in parallelo anziché in sequenza?

Edit: sono riuscito a ottenere il mio risultato finale desiderato di avere ogni uscita di ritorno compito, e verificando l'output di costruire un nuovo elenco di host di passare a execute():

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     return False 
    else: 
     return True 

@parallel 
def task_2(): 
    run('uname -s') 

def run_tests(): 
    results = execute(task_1) 
    successful_hosts = [k for k in results.iterkeys() if results[k]] 
    execute(test_2, hosts=successful_hosts) 

Questo funziona, ma è lordo per molte ragioni. C'è un modo migliore?

risposta

3

L'esecuzione parallela utilizza le forche e, come tale, non condivide le modifiche allo stato (indietro). Pertanto, la modifica di una variabile env in un'attività che viene eseguita in parallelo non influisce su altre istanze di quell'attività in esecuzione, né cambia nulla a livello globale prima della chiamata.

Se tutto il task_1 è in esecuzione è un controllo, perché non incorporare questa logica in task_2?

Problemi correlati