import subprocess
def my_function(x):
return x + 100
output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments
print output
#desired output: 101
Ich habe nur Dokumentation zum Öffnen von Unterprozessen mit separaten Skripten gefunden. Weiß jemand, wie man Funktionsobjekte übergibt oder wie man Funktionscode einfach übergibt?
Antworten:
Ich denke, Sie suchen eher nach dem Multiprozessor-Modul:
http://docs.python.org/library/multiprocessing.html#the-process-class
Das Unterprozessmodul dient zum Laichen von Prozessen und zum Ausführen von Aufgaben mit ihrer Eingabe / Ausgabe - nicht zum Ausführen von Funktionen.
Hier ist eine
multiprocessing
Version Ihres Codes:from multiprocessing import Process, Queue def my_function(q, x): q.put(x + 100) if __name__ == '__main__': queue = Queue() p = Process(target=my_function, args=(queue, 1)) p.start() p.join() # this blocks until the process terminates result = queue.get() print result
quelle
processify
Dekorateur als Verknüpfung verwenden: gist.github.com/2311116Sie können den Standard-Unix-
fork
Systemaufruf als verwendenos.fork()
.fork()
erstellt einen neuen Prozess mit demselben Skript. Im neuen Prozess wird 0 zurückgegeben, während im alten Prozess die Prozess-ID des neuen Prozesses zurückgegeben wird.child_pid = os.fork() if child_pid == 0: print "New proc" else: print "Old proc"
Für eine übergeordnete Bibliothek, die Multiprocessing-Unterstützung bietet und eine portable Abstraktion für die Verwendung mehrerer Prozesse bietet, gibt es das Multiprocessing- Modul. Es gibt einen Artikel über IBM DeveloperWorks, Multiprocessing with Python , mit einer kurzen Einführung in beide Techniken.
quelle
fork
nicht portabel ist. Ich werde im Allgemeinen nicht tragbare Antworten zusammen mit Informationen geben, dass sie nicht tragbar sind, und den Fragesteller entscheiden lassen, ob dies für sie ausreicht. Da ich meine Antwort bearbeitet habe, sollten Sie in der Lage sein, das Downvote zu entfernen, wenn Sie der Meinung sind, dass ich es ausreichend verbessert habe. Obwohl es keine harten Gefühle gibt, wollte ich nur überprüfen, was ich falsch gemacht habe.Der obige Beitrag von Brian McKenna über Multiprocessing ist wirklich hilfreich. Wenn Sie jedoch den Thread-Weg einschlagen möchten (im Gegensatz zu prozessbasiert), können Sie mit diesem Beispiel beginnen:
import threading import time def blocker(): while True: print "Oh, sorry, am I in the way?" time.sleep(1) t = threading.Thread(name='child procs', target=blocker) t.start() # Prove that we passed through the blocking call print "No, that's okay"
Sie können die
setDaemon(True)
Funktion auch verwenden, um den Thread sofort als Hintergrund zu verwenden.quelle