Вот эзотерический c pure- Python вопрос.
Я занимаюсь статистическим профилированием с использованием sys._current_frames()
. то есть у меня есть фоновый поток, который запускается sys._current_frames()
раз в секунду, выводит результаты в текстовый файл, а затем у меня есть некоторый код Python, который сортирует трассировки от наиболее распространенного к наименьшему.
Одно любопытное явление, которое я видел, - это следы, подобные этим:
File "/opt/foo/bar.py", line 1437, in __iter__
yield key
Этот yield
- генератор, который я написал. Любопытно, что на этой трассировке есть только один кадр. Как это могло произойти? Другие трассировки имеют много кадров, либо с верхнего уровня процесса, либо с верхнего уровня кадра. Что означает эта однокадровая трассировка стека?
Одна теория, которая у меня была, заключается в том, что это замороженное состояние генератора, после того как он получил значение и ожидает, пока next
снова будет вызван. Но я думаю, что я опроверг эту теорию с помощью отдельного эксперимента: я сделал генератор, гарантировал его приостановку, назвал sys._current_frames()
, и я не видел такой трассировки стека.