Multiprocessing Bombe

Ich arbeitete das folgende Beispiel von Doug Hellmann Tutorial auf Multiprocessing:

import multiprocessing def worker(): """worker function""" print 'Worker' return if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start() 

Als ich versuchte, es außerhalb der if-Anweisung auszuführen:

 import multiprocessing def worker(): """worker function""" print 'Worker' return jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start() 

Es begann Laichen Prozesse non-stop, und der einzige Weg, um es zu stoppen war neu gestartet!

Warum sollte das passieren? Warum hat es nicht 5 Prozesse generiert und beendet? Warum brauche ich die if-Anweisung?

3 Solutions collect form web for “Multiprocessing Bombe”

Bei Windows gibt es keine Gabelroutine, so dass multiprocessing das aktuelle Modul importiert, um Zugriff auf die worker Funktion zu erhalten. Ohne die if Anweisung startet der Kinderprozess seine eigenen Kinder und so weiter.

Beachten Sie, dass die Dokumentation erwähnt, dass Sie die if Anweisung auf Windows ( hier ) benötigen.

Allerdings ist die Dokumentation nicht sagen, dass dies tötet Ihre Maschine fast sofort, erfordert einen Neustart. So kann das ziemlich verwirrend sein, vor allem, wenn der Einsatz von multiprocessing in einer Funktion tief im Code passiert. Egal wie tief versteckt es ist, du brauchst noch die if Check in der Hauptprogrammdatei. Das ist ziemlich viel ausgeschlossen mit multiprocessing in jeder Art von Bibliothek.

multiprocessing im Allgemeinen scheint ein bisschen rau zu sein. Es könnte die Schnittstelle der Thread-Schnittstelle haben, aber es gibt einfach keinen einfachen Weg um die GIL.

Für komplexere Parallelisierungsprobleme würde ich auch das subprocess Modul oder einige andere Bibliotheken (wie mpi4py oder Parallel Python ) anschauen.

Ich weiß nicht über multiprocessing , aber ich vermute, dass es Kinderprozesse __name__ , die ein anderes __name__ global haben. Durch das Entfernen des Tests, machen Sie jedes Kind starten den Laichprozess wieder.

  • Wie man groß für schlaufen in python
  • Python: Effizienter Workaround zum Multiprocessing einer Funktion, die ein Datenelement einer Klasse ist, aus dieser Klasse
  • Begrenzung der Anzahl der Prozesse, die zu einem Zeitpunkt aus einem Python-Skript laufen
  • Python3.x Multiprocessing Radfahren ohne "if __name__ == '__main__':"
  • Multiprocessing-Prozess wird nicht beitreten, wenn komplexes Wörterbuch in Rückkehr-Warteschlange
  • Parallele Downloads mit pySmartDL - Python-Multiprozess
  • Dead einfaches Beispiel für die Verwendung von Multiprocessing Queue, Pool und Locking
  • Peinlich paralleles DB-Update mit Python (PostGIS / PostgreSQL)
  • Python multiprocess fängt an zu starten
  • Multiprocessing.freeze_support ()
  • Python-Multiprozess-Teilprozesse mit bestelltem Druck?
  • Python ist die beste Programmiersprache der Welt.