2015-06-17 21 views
8

Ho una funzione di classe (chiamiamola "alpha.py") che usa multiprocessing (processes = 2) per eseguire il fork di un processo e fa parte di un pacchetto Python che ho scritto. In uno script Python separato (chiamiamolo "beta.py"), ho istanziato un oggetto da questa classe e ho chiamato la funzione corrispondente che usa il multiprocessing. Infine, tutto questo è racchiuso all'interno di uno script Python wrapper (chiamiamolo "gamma.py") che gestisce molti oggetti e funzioni di classe diversi.Python Multiprocessing RuntimeError su Windows

Essenzialmente:

  1. Run ./gamma.py dalla linea di comando
  2. gamma.py utilizza sottoprocesso ed esegue beta.py
  3. beta.py un'istanza di un oggetto dalla classe alpha.py e chiama la funzione che utilizza multiprocessing (processes = 2)

Questo non ha problemi di esecuzione su un Mac o Linux. Tuttavia, diventa un problema su una macchina Windows e l'errore (e documentazione) suggerisce che avrei dovuto scrivere questo da qualche parte:

if __name__ == '__main__': 
    freeze_support() 

This other post menziona anche fare la stessa cosa.

Tuttavia, non so esattamente dove queste due righe dovrebbero risiedere. Al momento, né alpha.py, beta.py o gamma.py contiene una sezione if __name__ == '__main__':. Sarebbe bello se qualcuno potesse dirmi dove dovrebbero andare queste due linee e anche la logica dietro di esse.

+0

Puoi fornire un messaggio di errore con questo? traccia dello stack? Hai risolto questo. Sono sorpreso che non ci fosse una risposta. –

risposta

2

Attualmente, freeze_support() non è necessario qui. Otterrai un RuntimeError perché crei e avvii i tuoi nuovi processi al livello più alto del tuo modulo beta.

Quando viene creato un nuovo processo utilizzando multiprocessing in Windows, un nuovo interprete Python verrà avviato in questo processo e proverà ad importare il modulo con la funzione di destinazione che deve essere eseguita. Questo è il tuo modulo beta. Ora, quando lo importi, tutte le tue istruzioni di livello superiore dovrebbero essere eseguite, il che causerà la creazione e il riavvio di un nuovo processo. E poi, ricorsivamente, un altro processo da quel processo, e così via e così via.

Questo probabilmente non è ciò che si desidera, pertanto i nuovi processi devono essere inizializzati e avviati una sola volta, quando si esegue beta.py direttamente con uno subprocess.

if __name__ == '__main__': deve essere inserito in beta.py, quindi spostare l'inizializzazione e avviare il codice per i nuovi processi in questa sezione. Dopodiché, quando beta.py verrà importato e non verrà eseguito direttamente, non verrà avviato alcun nuovo processo e non vedrai effetti collaterali.

Problemi correlati