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):
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?
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 Beispielemultiprocessing.Pool
funktionieren nicht der interaktive Dolmetscher ...
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
da Anweisungen innerhalb dieses if-statement
beim Import nicht aufgerufen werden.
__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.
Tags und Links python multiprocessing