2012-10-20 20 views
17

Quali sono le best practice o soluzioni per l'utilizzo di thread di multiprocessing e user nella stessa applicazione python in Linux rispetto al problema 6721, I lock nella libreria standard python devono essere sterilizzati su fork?Stato di miscelazione multiprocesso e threading in Python

Perché ho bisogno di entrambi? Uso i processi figli per eseguire calcoli pesanti che producono risultati di strutture dati troppo grandi per essere restituiti attraverso una coda, ma devono essere immediatamente archiviati su disco. Sembrava efficiente avere ciascuno di questi processi figli monitorati da un thread separato, così che una volta terminato, il thread poteva gestire l'IO della lettura dei dati di grandi dimensioni (ad esempio multi GB) nel processo in cui il risultato era necessario per un ulteriore calcolo in combinazione con i risultati di altri processi figli. I processi figli si bloccheranno in modo intermittente, cosa che ho appena scoperto (dopo aver battuto molto la testa) trovata usando il modulo di registrazione. Altri hanno documentato il problema qui:

https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy

che punta a questo problema pitone apparentemente irrisolto: Locks in python libreria standard devono essere sterilizzate sulla forcella; http://bugs.python.org/issue6721

allarmato la difficoltà che avevo questo tipo di monitoraggio verso il basso, ho risposto:

Are there any reasons not to mix Multiprocessing and Threading module in Python

con il suggerimento piuttosto inutile a 'Fare attenzione' e collegamenti a quanto sopra.

Ma la lunga discussione su: numero 6721 suggerisce che si tratta di un "bug" per utilizzare entrambi i processi multiprocessing (o os.fork) e utente nella stessa applicazione. Con la mia comprensione limitata del problema, trovo troppo disaccordo nella discussione per concludere quali sono i work-around o le strategie per utilizzare sia il multiprocessing che il threading nella stessa applicazione. Il mio problema immediato è stato risolto disabilitando la registrazione, ma ho creato una piccola manciata di altri blocchi (espliciti) in entrambi i processi genitore e figlio, e sospetto che mi stia preparando per ulteriori deadlock intermittenti.

È possibile fornire consigli pratici per evitare blocchi di deadlock durante l'utilizzo di blocchi e/o del modulo di registrazione durante l'utilizzo di threading e multiprocessing in un'applicazione python (2.7.3.2.3.3)?

+2

La cosa interessante è che 'modulo multiprocessing' già utilizza il modulo' treading' internamente per creare alcuni tipi forcella-aware (tra cui un tipo di blocco). Vedi 'util.py'. Questi tipi sono usati nella classe 'BaseProxy' da' manager.py'. –

risposta

2

Sarai al sicuro se esegui processi aggiuntivi mentre hai ancora un solo thread nel programma (ovvero, fork dal thread principale, prima di generare thread di lavoro).

Il vostro caso d'uso sembra che non sia nemmeno necessario il modulo di multiprocessing; puoi usare subprocess (o anche semplici chiamate os.system).

Vedi anche Is it safe to fork from within a thread?

+2

[questa risposta] (http://stackoverflow.com/a/6079669/4279) è particolarmente rilevante per la domanda – jfs

+0

che è un post precedente molto utile, grazie. Capisco che non ho bisogno del modulo multiprocessing, ma fornisce una coda che uso (non solo per il risultato finale). – ricopan

+0

Ri: biforcazione con un filo. Buon Consiglio. Qui sto attraversando un grafico di dipendenza sconosciuta, quindi è un po 'complicato, ma faccio un bivio in anticipo per creare un server in un processo separato, che monitora una coda di richieste e avvia nuovi processi. Funziona con un'applicazione standaone in cui ho il controllo dello stato ereditato, ma come biblioteca devo occuparmi di quello stato. – ricopan

Problemi correlati