2009-04-27 3 views
5

Ich habe einen Python-Dienst mit langer Laufzeit, und ich würde gerne wissen, wie viel kumulative Wanduhrzeit von irgendwelchen ausführbaren Threads (d. H. Threads, die aus einem anderen Grund nicht blockiert waren) auf die GIL gewartet hat. Gibt es einen einfachen Weg, dies zu tun? Z. B. könnte ich vielleicht einige Zähler in der Protokolldatei ablegen.Gibt es eine einfache Möglichkeit zu sagen, wie viel Zeit damit verbracht wird, auf die Python GIL zu warten?

Meine zugrunde liegende Motivation ist es, die GIL als eine Quelle der Mystery Response Latenz von diesen lang andauernden Prozessen auszuschließen. Es gibt keinen besonderen Grund, die GIL zu vermuten (abgesehen davon, dass es zu den Symptomen passen würde), aber andere Formen der Protokollierung haben noch nichts ergeben, also, wenn es einfach ist, wäre es nett, diese Information zu haben .

Antwort

3

Ich glaube nicht, dass es einen einfachen Weg gibt. Es gibt wahrscheinlich einen unangenehmen Weg, Python neu zu erstellen, um die PyThreadState-Liste zu durchlaufen und die Threads jedes Mal zu zählen, wenn die Sperre erworben wird, aber ich bezweifle, dass es sich lohnt!

Ich weiß, dass dies eine spekulative Frage ist, aber wenn Sie nur mäßig besorgt darüber sind, dass Verzögerungen durch Threading verursacht werden, kann es ratsam sein, zu einem Multiprocessing-Modell anstelle eines Multithreading-Modells zu wechseln. Da Prozesse in Python sowohl sicherer als auch besser skalierbar sind, sind sie fast immer die beste Wahl, wenn sie praktikabel sind.

0

Sie können jetzt die GIL-Nutzung mit gil_load profilieren.

Siehe my answer zu der anderen Frage.

+0

Das Projekt gil_load sagt Ihnen, wie oft die GIL gehalten wird (dh * mindestens ein * Thread ist ausführbar). Die Frage fragt, wie oft auf die GIL gewartet wird (dh * mindestens zwei * Threads sind ausführbar). Wie erreichst du das mit gil_load? –

Verwandte Themen