2010-01-12 7 views
41
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 Teilprozessen mit separaten Skripten gefunden. Kann jemand Funktionsobjekte übergeben oder sogar einfach den Funktionscode übergeben?Ist es möglich, die Funktion in einem Unterprozess ohne Threading oder Schreiben einer separaten Datei/eines separaten Skripts auszuführen?

+1

Ich glaube, dass Sie nach dem Modul [Multiprocessing] (http://docs.python.org/3.1/library/multiprocessing.html) suchen. –

Antwort

65

Ich glaube, du bist für etwas mehr wie die Multiprocessing-Modul suchen:

http://docs.python.org/library/multiprocessing.html#the-process-class

Der Subprozess Modul ist für Laich Prozesse und Dinge zu tun, mit deren Eingabe/Ausgabe - nicht für Funktionen ausgeführt werden. Hier

ist eine multiprocessing Version des 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 
+13

Sie können den "processify" Dekorator als eine Verknüpfung verwenden: https://gist.github.com/2311116 – schlamar

+1

Ich nehme an, dass dies den Python-Interpreter und alle seine Umgebung für den Subprozess klont? – Jens

+0

Hier ist eine Abzweigung von Processify, die in Python 3 funktioniert und Generatorfunktionen unterstützt. https://gist.github.com/stuaxo/889db016e51264581b50 –

14

können Sie den Standard-Unix-fork Systemaufruf verwenden, wie os.fork(). fork() erstellt einen neuen Prozess, wobei das gleiche Skript ausgeführt wird. Im neuen Prozess gibt es 0 zurück, während es im alten Prozess die Prozess-ID des neuen Prozesses zurückgibt.

child_pid = os.fork() 
if child_pid == 0: 
    print "New proc" 
else: 
    print "Old proc" 

Für eine höhere Level-Bibliothek, sieht vor, dass Multiprocessing-Unterstützung, die für die Verwendung von mehreren Prozessen eine tragbare Abstraktion bietet, gibt es das multiprocessing Modul. Es gibt einen Artikel über IBM DeveloperWorks, Multiprocessing with Python, mit einer kurzen Einführung in beide Techniken.

+0

Ich bin neugierig; Warum der Downvote? Ist etwas falsch in meiner Antwort? –

+0

Multiprozessing ist nicht nur ein Wrapper auf höherer Ebene um fork(), es ist ein Multiplattform-Multiprocessing-Toolkit (das fork unter Unix verwendet). Das ist wichtig, weil das bedeutet, dass es beispielsweise auf Windows läuft, während fork() dies nicht tut. Edit: Und das war der Grund für den Downvote, obwohl ich später entschied, dass es wahrscheinlich nicht wert war. Zu spät, um es zurückzunehmen. Edit2: Oder eher, Gabel() vorgeschlagen wird, wenn es nicht plattformübergreifend ist, war der Grund. –

+1

@Devin, Sie können immer einen Downvote zurücknehmen, wenn Sie möchten. –

3

Brian McKenna oben Beitrag über Multiprozessing ist wirklich hilfreich, aber wenn Sie die Gewinde Route (im Gegensatz zu prozessbasierten) gehen wollten dieses Beispiel, wird Ihnen den Einstieg:

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 auch verwenden können die setDaemon(True)-Funktion, um den Thread sofort anzuzeigen.