2008-08-22 9 views
21

Wie implementiere ich eine Logik, die es mir ermöglicht, die Funktionalität, die ich unter Linux mit dem fork() Systemaufruf unter Verwendung von Python unter Windows habe, zu reproduzieren?Was ist der beste Weg, um fork() in Windows zu duplizieren?

Ich versuche speziell, eine Methode auf der SAPI Com-Komponente auszuführen, während die andere Logik im Hauptthread ohne Blockierung oder Warten fortgesetzt wird.

Antwort

3

Sehen Sie sich die Prozessmanagementfunktionen in os module an. Es gibt Funktionen zum Starten neuer Prozesse auf viele verschiedene Arten, sowohl synchron als auch asynchron.

Ich sollte auch beachten, dass Windows keine Funktionalität bietet, die genau wie fork() auf anderen Systemen ist. Um Multiprocessing unter Windows durchzuführen, müssen Sie das Modul threading verwenden.

+8

'subprocess' und' multiprocessing' (vorgeschlagen von RJBrady) könnten bessere Alternativen zu 'os' sein und 'threading'. – jfs

+1

'threading' führt in CPython keine eigentliche Mehrfachverarbeitung durch. – clacke

3

Neben dem Prozessmanagement-Code in dem os-Modul, das Greg wies darauf hin, sollen Sie am Threading-Modul einen Blick auch: https://docs.python.org/library/threading.html

from threading import Thread 

def separate_computations(x, y): 
    print sum(x for i in range(y)) # really expensive multiplication 

Thread(target=separate_compuations, args=[57, 83]).start() 
print "I'm continuing while that other function runs in another thread!" 
2

Das könnte dir auch das Verarbeitungsmodul (http://pypi.python.org/pypi/processing) wie mit . Es hat viele Funktionen zum Schreiben paralleler Systeme mit der gleichen API wie das Threading-Modul ...

+1

Ab Python 2.6/3.0 (Oktober und Dezember 2008) ist 'processing' Teil der Standardbibliothek als' multiprocessing'. – clacke

3

Das Threading-Beispiel von Eli wird den Thread ausführen, aber keine Arbeit nach dieser Zeile.

Ich werde in das Verarbeitungsmodul und das Subprozessmodul schauen. Ich denke, dass die com-Methode, die ich ausführe, in einem anderen Prozess sein muss, nicht nur in einem anderen Thread.

+2

'Multiprocessing' Modul ist ein Teil der Standardbibliothek. 'subprocess' passt für externe Programme,' multiprocessing' passt für Python-Code. – jfs

10

fork()hat tatsächlich in Windows dupliziert worden ist, unter Cygwin, aber es ist ziemlich behaart.

Der Gabelaufruf in Cygwin ist besonders interessant, weil es nicht gut auf der Win32-API abbildet. Dies macht es sehr schwierig, korrekt zu implementieren.

Siehe die The Cygwin User's Guide für eine Beschreibung dieses Hack.

16

Verwenden Sie den Python multiprocessing module, der überall funktioniert.

Hier ist eine IBM developerWords article, die zeigt, wie Sie von os.fork() in das Multiprocessing-Modul konvertieren.

+1

Dies ist die richtige Antwort, aber wegen des Fehlens von 'fork()' unter Windows gibt es ein paar Vorbehalte, vor allem um sicherzustellen, dass jedes Skript durch ein 'if __name__ ==" __main __ "' geschützt ist bewachen, wenn es irgendeinen Code aufrufen soll, der Multiprocessing durchführt. Der erzeugte Prozess startet neu und muss Module laden, um den Zustand rekonstruieren zu können. – clacke