2009-04-27 14 views
5

Possiedo un servizio Python a esecuzione prolungata e vorrei sapere quanti minuti cumulativi sono stati spesi da qualsiasi thread eseguibile (ad esempio, thread non bloccati per altri motivi) in attesa di GIL. C'è un modo semplice per farlo? Ad esempio, forse potrei periodicamente scaricare un contatore nel suo file di registro.C'è un modo semplice per dire quanto tempo è trascorso in attesa di Python GIL?

La mia motivazione di base è escludere il GIL come una fonte di latenza di risposta di mistero da questi processi di lunga durata. Non v'è alcun motivo particolare per sospettare l'GIL (diverso da quello che si adatterebbe i sintomi), ma altre forme di registrazione non hanno trasformato ancora nulla, quindi, se è facile, sarebbe bello avere queste informazioni .

risposta

3

non credo che ci sia un modo semplice. C'è probabilmente un modo goffo, coinvolgendo la ricostruzione Python per attraversare la lista PyThreadState e contare i fili ogni volta che il blocco è stato acquisito, ma dubito ne vale la pena!

So che questa è una domanda speculativa, ma se si è anche moderatamente preoccupati di ritardi causati dal threading, potrebbe essere prudente passare a un modello di multiprocessing anziché a un modello multithreading. Poiché i processi sono entrambi più sicuri e scalabili in Python, sono quasi sempre la scelta migliore se praticabile.

0

È ora possibile profilo l'utilizzo di GIL utilizzando gil_load.

Vedere my answer per l'altra domanda.

+0

Il progetto gil_load indica la frequenza con cui viene tenuto GIL (ovvero, * almeno un * thread è eseguibile). La domanda chiede quanto spesso il GIL è in attesa (cioè, * almeno due thread * sono eseguibili). Come lo ottieni con gil_load? –

Problemi correlati