Wie wir alle wissen, müssen wir den main()
schützen, wenn Code mit multiprocessing
in Python läuft if __name__ == '__main__'
verwenden.Behelfslösung für __name mit __ == ‚__ main__‘ in Python Multiprocessing
Ich verstehe, dass dies in einigen Fällen notwendig ist, den Zugriff auf Funktionen in der Haupt definiert zu geben, aber ich verstehe nicht, warum dies in diesem Fall notwendig ist:
file2.py
import numpy as np
from multiprocessing import Pool
class Something(object):
def get_image(self):
return np.random.rand(64,64)
def mp(self):
image = self.get_image()
p = Pool(2)
res1 = p.apply_async(np.sum, (image,))
res2 = p.apply_async(np.mean, (image,))
print(res1.get())
print(res2.get())
p.close()
p.join()
main.py
Alle für Something
erforderlichen Funktionen oder Importe sind Teil von file2.py
. Warum muss der Unterprozess die main.py
erneut ausführen?
Ich denke, die __name__
Lösung ist nicht sehr nett, da dies verhindert, dass ich den Code von file2.py
verteile, da ich nicht sicherstellen kann, dass sie ihre Haupt schützen. Gibt es keine Problemumgehung für Windows? Wie sind Pakete zu lösen, dass -
bearbeiten (da ich nie ein Problem nicht schützen mein Haupt mit jedem Paket begegnet sind sie mit Multiprozessing einfach nicht?): Ich weiß, dass dies wegen der fork()
ist nicht implementiert in Windows. Ich frage mich, ob es ein Hack ist der Dolmetscher bei file2.py
statt main.py
beginnen zu lassen, wie ich sicher sein kann, dass file2.py
autark ist
Der 'if __name__ == '__main __'' Hack ist nur unter Windows notwendig, da diese Plattform kein 'fork()' hat. Wenn Sie _jemand_ anderes Betriebssystem wählen, brauchen Sie es nicht. –
OP, nur um zu bestätigen, Sie _ sind _ auf Windows, richtig? –
Wenn ich Sie richtig verstanden habe, schreiben Sie 'file2.py' als Bibliothek, und Sie möchten Benutzercode wie' main.py' unterstützen (der möglicherweise in Zukunft von einer anderen Person geschrieben wird). Leider glaube ich nicht, dass es einen Weg gibt, Ihre Benutzer vor den Anforderungen von Multiprocessing zu schützen. Sie müssen wahrscheinlich nur dokumentieren, dass Ihr Modul Skript-Code benötigt, der in 'if __name__ ==" __main __ "' Blöcke gesetzt wird, so dass nichts ausgeführt wird, wenn das Modul importiert wird. – Blckknght