2016-04-15 19 views
1

Ich versuche, einige Skripte gleichzeitig auf mehreren Servern auszuführen. Hier ist der Beispielcode.Python-Fabric für parallele Verarbeitung

server1 = "" 
server2 = "" 

env.parallel = True 

@task 
@hosts(server1) 
@parallel 
def run_shell1(): 
    run("sh shell1.sh") 

@task 
@hosts(server2) 
@parallel 
def run_shell2(): 
    run("sh shell2.sh") 

Und lief ich die fab Befehle wie folgt aus:

fab run_shell1 run_shell2 

Aber wenn ich den Code lief, habe ich den Fehler wie folgt aus:

pickle.PicklingError: Can't pickle <function inner at 0x0000000003280438>: it's 
not found as fabric.tasks.inner 

Es gab auch einige andere Fehler Meldungen über multiprocessing/process.py und fabric/job_queue.py usw.

Ich habe die Version des Stoffes überprüft, es ist 1 .11.1.

+0

Ist dies Ihr vollständiger Code? Ich bin kein Stoffexperte, aber etwas scheint zu fehlen. –

+0

Ja, es ist fast voller Code. Was fehlt? –

+0

Nicht sicher, basierend auf der Fehlermeldung hätte ich erwartet, eine innere Funktion zu sehen, wie eine verschachtelte Aufgabe oder etwas - aber vielleicht hat es etwas mit '@ parallel' zu tun, ich habe dieses Feature nicht selbst benutzt. –

Antwort

2

Es ist ein bekannter Fehler in Stoffe für dieses Problem bezogen werden:

https://github.com/fabric/fabric/issues/489

Insbesondere sieht dies für die Erklärung: https://github.com/fabric/fabric/issues/489#issuecomment-4232091

Der Kern ist, dass der forking.Popen() -Implementierung für Win32 verursacht hier Probleme beim Multiprocessing.

Ich denke, sie werden es mit Fabric 2.x beheben

+0

Wow, 2 Sekunden diff :) Ich werde nur meine Antwort entfernen. Schön! –

+0

Hehe. Du hast mich. – nir0s

Verwandte Themen