2012-05-15 4 views
12

Gibt es eine Möglichkeit, Hosts dynamisch zwischen mehreren parallelen Tasks zu ändern? Das habe ich bisher.Dynamische Hosts und parallele Tasks mit Fabric-Bibliothek

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') 

Offensichtlich fehlt mir einige env paramenters, aber ich will nur task_2 auf Hosts ausgeführt werden, die die Bedingung in task_1 befriedigen. Es scheint task_2 Host-Liste wird beim Start initialisiert, weil es auf allen Hosts in der ursprünglichen env.hosts Liste ausgeführt in init_hosts() definiert ausgeführt wird. Ich habe auch versucht, rootdefs dynamisch zu modifizieren und zu erstellen, hatte aber das gleiche Ergebnis.

Edit: Gibt es auch eine Möglichkeit, eine parallele Ausführungswarteschlange einzurichten, so dass mehrere parallele Tasks parallel statt nacheinander ausgeführt werden?

Edit: konnte ich meine gewünschte Endergebnis erhalten, indem jede Aufgabe Rückkehr Ausgang, und Analysieren der Ausgabe eines neuen Host-Liste erstellen auszuführen() übergeben:

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) 

Dies funktioniert, aber es ist grob aus vielen Gründen. Gibt es einen besseren Weg?

Antwort

3

Die parallele Ausführung verwendet Gabeln und teilt daher (Zustandsänderungen) nicht. Das Ändern einer env-Variable in einer Task, die parallel ausgeführt wird, hat keine Auswirkungen auf andere Instanzen dieser Task und ändert auch nichts, was vor dem Aufruf global festgelegt wurde.

Wenn alles, was task_1 macht, eine Prüfung ist, warum sollte man diese Logik nicht einfach in task_2 einbauen?