2013-01-05 17 views
13

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.

risposta

23

Windows non dispone di fork, quindi non c'è modo di creare un nuovo processo come quello esistente. Quindi il processo secondario deve eseguire nuovamente il codice, ma ora è necessario un modo per distinguere tra il processo principale e il processo figlio e lo è __main__.

Questo argomento è trattato nella documentazione qui: http://docs.python.org/2/library/multiprocessing.html#windows

Non conosco un altro modo per strutturare il codice per evitare l'effetto della bomba forcella.

+4

Questa risposta deve essere accettata. – Marcin

+1

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

+0

@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. –

Problemi correlati