Ho un sistema scritto in python che elabora grandi quantità di dati utilizzando plug-in scritti da diversi sviluppatori con diversi livelli di esperienza.Trova plug-in cpu-hogging in python multithreading
Fondamentalmente, l'applicazione avvia diversi thread di lavoro, quindi li alimenta. Ogni thread determina il plug-in da utilizzare per un elemento e chiede di elaborare l'elemento. Un plug-in è solo un modulo python con una funzione specifica definita. L'elaborazione di solito comporta espressioni regolari e non dovrebbe richiedere più di un secondo.
Occasionalmente, uno dei plug-in richiede minuti da completare, pegging la CPU al 100% per tutto il tempo. Questo di solito è causato da un'espressione regolare subottimale associata a un elemento di dati che espone tale inefficienza.
Questo è dove le cose si complicano. Se ho il sospetto di chi sia il colpevole, posso esaminare il suo codice e trovare il problema. Tuttavia, a volte non sono così fortunato.
- Non riesco a passare da solo. Probabilmente occorrerebbe settimane per riprodurre il problema se lo faccio.
- L'aggiunta di un timer al plug-in non aiuta, perché quando si blocca ci vuole il GIL con esso, e anche tutti gli altri plugin impiegano minuti per essere completati.
- (Nel caso ve lo stiate chiedendo, lo SRE engine doesn't release the GIL).
- Per quanto ne so, profiling è piuttosto inutile quando si esegue il multithreading.
Non riesco a riscrivere l'intera architettura in multiprocessing, in qualsiasi modo posso scoprire chi sta mangiando tutta la mia CPU?
AGGIUNTO: In risposta ad alcuni dei commenti:
il profiling del codice multithreaded in python non è utile perché il profiler misura il tempo funzione di totale e non il tempo di CPU attiva. Prova cProfile.run ('time.sleep (3)') per vedere cosa intendo. (credito a rog [ultimo commento]).
Il motivo per cui il threading singolo è difficile è perché solo un elemento in 20.000 causa il problema e non so quale sia. L'esecuzione di multithreading mi consente di esaminare 20.000 elementi in circa un'ora, mentre il thread singolo può richiedere molto più tempo (la latenza della rete è molto elevata). Ci sono altre complicazioni a cui preferirei non entrare in questo momento.
Detto questo, non è una cattiva idea per cercare di serializzare il codice specifico che chiama i plugin, in modo che i tempi di uno di essi, i tempi degli altri. Ci proverò e riferirò.
Quale parte delle informazioni di profilazione è stata compromessa dal multithreading? –
Puoi spiegare perché andare single-thread non funzionerà? Se i plug-in non rilasciano mai il GIL, non si verificherà alcuna elaborazione parallela e il multithreading non sarà di aiuto. –
"Non posso andare a thread singolo. Probabilmente ci vorranno settimane per riprodurre il problema se lo faccio"; Sbagliato. Probabilmente andando single threaded avrai il risultato PIÙ VELOCE che thread. – nosklo