2010-04-23 5 views
32

stavo lavorando il seguente esempio da Doug Hellmann tutorial su multiprocessing:Multiprocessing Bomba

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() 

Quando ho provato a farlo funzionare al di fuori del if:

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() 

E 'iniziato processi di riproduzione non-stop, e l'unico modo per fermarlo era riavviare!

Perché dovrebbe succedere? Perché non ha generato 5 processi ed è uscito? Perché ho bisogno dell'istruzione if?

risposta

43

Su Windows non esiste la routine fork(), quindi multiprocessing importa il modulo corrente per accedere alla funzione worker. Senza la dichiarazione if, il processo figlio avvia i propri figli e così via.

+1

È interessante sapere ora, dopo che mi è costato 2 riavvii;) –

+0

Come lo fermeresti una volta avviato? Uccidere il processo nel task manager non sembra influenzarlo. –

+1

Esistono limiti e killall nei sistemi POSIX, ma non conosco la soluzione per Windows. –

3

Non so multiprocessing, ma ho il sospetto che generi processi figlio che hanno un diverso __name__ globale. Rimuovendo il test, stai facendo in modo che ogni bambino avvii di nuovo il processo di spawning.

6

Si noti che la documentazione menziona che è necessaria l'istruzione if su Windows (here).

Tuttavia, la documentazione non dice che questo uccide la macchina quasi istantaneamente, richiedendo un riavvio. Quindi questo può essere abbastanza confuso, specialmente se l'uso di multiprocessing avviene in qualche funzione nel profondo del codice. Non importa quanto sia profondamente nascosto, hai ancora bisogno del controllo if nel file di programma principale. Questo praticamente esclude l'utilizzo di multiprocessing in qualsiasi tipo di libreria.

multiprocessing in generale sembra un po 'approssimativo. Potrebbe avere l'interfaccia dell'interfaccia del thread, ma non c'è un modo semplice per aggirare il GIL.

Per problemi di parallelizzazione più complessi, vorrei anche esaminare il modulo subprocess o alcune altre librerie (come mpi4py o Parallel Python).

+0

Qualche buona esercitazione sul pacchetto del sottoprocesso? –

+0

Spiacente, non ho trovato nessuno di quelli veramente semplici (c'è un articolo PyMOTW per esempio). Fondamentalmente si creano processi Python che eseguono il proprio script di lavoro. È possibile inviare/ricevere dati utilizzando lo stdin/stdout di questi processi (ad es. Invio di oggetti in forma decapata). – nikow

+0

Nota che il multiprocessing ha i suoi usi ed è ancora l'opzione più semplice se riesci a farlo funzionare per il tuo problema. Ma se non funziona per te, allora usare il sottoprocesso non è molto più lavoro (forse un centinaio di righe di codice) e ti offre più opzioni. – nikow