Sto giocando con una libreria per i miei studenti principianti e sto usando il modulo multiprocessing in Python. Mi sono imbattuto in questo problema: importing and using a module that uses multiprocessing without causing infinite loop on WindowsPerché il modulo di multiprocessing di Python importa __main__ all'avvio di un nuovo processo su Windows?
Per fare un esempio, supponiamo di avere un modulo mylibrary.py
:
# mylibrary.py
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print "Hello from the new process"
def foo():
p = MyProcess()
p.start()
E un programma principale che chiama questa libreria:
# main.py
import mylibrary
mylibrary.foo()
Se corro main.py
su Windows cerca di importare main.py nel nuovo processo, il che significa che il codice viene nuovamente eseguito, il che si traduce in un ciclo infinito di generazione del processo. Posso risolvere il problema in questo modo:
import mylibrary
if __name__ == "__main__":
mylibrary.foo()
Ma, questo è piuttosto confusa per i principianti, e per di più sembra che non dovrebbe essere necessario. Il nuovo processo viene creato in mylibrary
, quindi perché il nuovo processo non importa solo mylibrary
? C'è un modo per ovviare a questo problema senza dover cambiare main.py
?
Sto usando Python 2.7, a proposito.
Questa risposta deve essere accettata. – Marcin
Sono sicuro che mi manca qualcosa, ma la mia domanda è perché il processo figlio deve eseguire nuovamente tutto il codice. Perché non solo il modulo che ha avviato il nuovo processo? – Laura
@Laura: deve eseguire di nuovo tutto il codice, perché se così non fosse, non avrebbe il tuo codice. Il processo figlio inizia completamente nuovo e se vuoi che abbia le tue funzioni, ha bisogno del tuo codice. –