Python-Multiprocessing in Windows, wenn __name__ == "__main__"

8

Ausführen von Python 2.7 auf Windows 7 (64bit).

Beim Lesen der Dokumentation für das Bibliotheksmodul multiprocessing wird mehrfach auf die Wichtigkeit des Moduls __main__ hingewiesen, einschließlich der Bedingung (insbesondere in Windows):

%Vor%

Ich verstehe, dass Sie keine Process () - Instanzen im globalen Namespace des Moduls erstellen möchten (denn wenn der Child-Prozess das Modul importiert, wird er unbeabsichtigt ein weiteres erzeugen).

Ich muss die Prozessmanager jedoch nicht auf die oberste Ebene meiner Paketausführungshierarchie setzen (Ausführung in PARENT). Solange meine Process () - Methoden in einer Klassenmethode oder sogar in einem Funktionsabschluss erstellt, verwaltet und beendet werden. Nur nicht im Toplevel-Modul-Namespace.

Verstehe ich diese Warnung / Anforderung richtig?

BEARBEITEN

Nach den ersten beiden Antworten füge ich dieses Zitat hinzu. Dies ist in der Einleitung für Abschnitt 16.6 Multiprocessing aus den 2.7 Dokumente.

  

Hinweis : Die Funktionalität in diesem Paket erfordert, dass das Modul __main__ von den untergeordneten Elementen importiert werden kann. Dies ist in der Programmierung abgedeckt   Richtlinien jedoch ist es wert, darauf hinzuweisen. Dies bedeutet, dass einige   Beispiele wie die Beispiele multiprocessing.Pool funktionieren nicht   der interaktive Dolmetscher ...

    
user2097818 26.11.2013, 16:26
quelle

2 Antworten

15

Sie müssen Process() nicht von der "obersten Ebene" des Moduls aufrufen. Es ist völlig in Ordnung, Process von einer Klassenmethode aus aufzurufen.

Die einzige Einschränkung besteht darin, dass Process() nicht aufgerufen werden kann, wenn oder das Modul importiert wird .

Da Windows keine fork hat, startet das Multiprocessing-Modul einen neuen Python-Prozess und importiert das aufrufende Modul. Wenn Process() beim Import aufgerufen wird, setzt dies eine unendliche Folge neuer Prozesse in Gang (oder bis Ihre Maschine keine Ressourcen mehr hat). Dies ist der Grund dafür, Aufrufe in Process() in

zu verstecken %Vor%

da Anweisungen innerhalb dieses if-statement beim Import nicht aufgerufen werden.

    
unutbu 26.11.2013, 16:34
quelle
0

__name__ ist immer nur gleich "__main__" , wenn das Skript direkt ausgeführt wurde, entweder über python foo.py oder python -m foo . Dieses stellt sicher, dass Process() nicht aufgerufen wird, wenn das Skript stattdessen als Modul importiert wird.

    
Ignacio Vazquez-Abrams 26.11.2013 16:37
quelle

Tags und Links