Есть ли простой способ узнать, сколько времени уходит на ожидание Python GIL? - PullRequest
6 голосов
/ 28 апреля 2009

У меня есть долго работающий сервис Python, и я хотел бы знать, сколько кумулятивного времени настенных часов было потрачено любыми работающими потоками (то есть потоками, которые не были заблокированы по какой-либо другой причине), ожидающими GIL. Есть простой способ сделать это? Например, возможно, я мог бы периодически сбрасывать какой-то счетчик в его файл журнала.

Моя основная мотивация состоит в том, чтобы исключить GIL как источник загадочной задержки ответа от этих длительных процессов. Нет особой причины подозревать GIL (кроме того, что он соответствовал бы симптомам), но другие формы ведения журнала еще ничего не выявили, поэтому если это просто , было бы неплохо иметь эту информацию.

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

Я не думаю, что есть простой способ. Вероятно, есть неуклюжий способ, связанный с перестройкой Python для обхода списка PyThreadState и подсчета потоков при каждом получении блокировки, но я сомневаюсь, что оно того стоит!

Я знаю, что это спекулятивный вопрос, но если вы даже в меру обеспокоены наличием задержек, вызванных многопоточностью, может быть целесообразно перейти к многопроцессорной модели вместо многопоточной модели. Поскольку в Python процессы более безопасны и более масштабируемы, они практически всегда являются лучшим выбором, если это возможно.

0 голосов
/ 29 апреля 2017

Теперь вы можете профилировать использование GIL, используя gil_load .

См. мой ответ на этот другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...