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)?
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'. –