2009-03-17 13 views
45

Sto sviluppando un modulo intrinsecamente multithread in Python, e mi piacerebbe scoprire dove sta spendendo il suo tempo. cProfile sembra solo profilare il thread principale. C'è un modo per profilare tutti i thread coinvolti nel calcolo?Come posso profilare un programma multithread in Python?

risposta

28

Vedere yappi (ancora un altro profiler Python).

+0

Si noti che mentre yappi sembra la risposta corretta, è un codice sorgente C e deve essere compilato. Non ci sono binari pre-costruiti nella pagina del progetto. – velis

+0

@velis: è possibile utilizzare pip: 'pip install yappi'. –

+2

Documentazione chiunque? come posso ordinare i risultati per recuperare i primi 10 consumatori di tempo totale? – Dejell

-1

Non conosco alcuna applicazione di profilazione che supporti tale funzionalità per Python, ma è possibile scrivere una classe di traccia che scrive i file di registro in cui si inseriscono le informazioni di quando un'operazione viene avviata e al termine e quanto tempo ha consumato.

È una soluzione semplice e veloce per il tuo problema.

14

Invece di eseguire uno cProfile, è possibile eseguire un'istanza separata cProfile in ciascun thread, quindi combinare le statistiche. Stats.add() lo fa automaticamente.

+0

non è eccezionale quando il programma è in fase di avvio e interrompe molti thread nel corso del calcolo: richiede di strumentare l'intero programma, influendo potenzialmente in modo grave sui risultati. – rog

+3

In realtà dovresti solo modificare il metodo Thread.run(). – vartec

+0

ciò che intendo è che il sovraccarico di creazione e salvataggio dell'istanza del profilo per ogni esecuzione del thread potrebbe facilmente alterare i risultati. Non penso sia possibile creare statistiche senza salvare in un file. – rog

4

Se stai bene con un po 'di lavoro extra, puoi scrivere la tua classe di profilo che implementa profile(self, frame, event, arg). Questo viene chiamato ogni volta che viene chiamata una funzione, e puoi facilmente impostare una struttura per raccogliere statistiche da quella.

È quindi possibile utilizzare per registrare tale funzione su ogni thread. Quando viene chiamata la funzione, è possibile utilizzare threading.currentThread() per vedere su quale è in esecuzione. Maggiori informazioni (e ready-to-run ricetta) qui:

http://code.activestate.com/recipes/465831/

http://docs.python.org/library/threading.html#threading.setprofile

1

Dato che le funzioni principali tuoi thread diversi differiscono, è possibile utilizzare il molto utile profile_func() decoratore da here.

Problemi correlati