1

С обычными вызовами функций состояние программы в основном описывается простым стеком вызовов. Он распечатывается как след после неперехваченного исключения, его можно проверить с помощью inspect.stack и его можно отобразить в отладчике после точки останова.Как проверить состояние программы в присутствии генераторов/сопрограмм?

В присутствии генераторов, кулеров на основе генераторов и async def на основе сопрограммы, я не думаю, что стека вызовов достаточно. Каков хороший способ мысленно визуализировать состояние программы? Как проверить его во время выполнения?

Есть функции inspect.getgeneratorstate и inspect.getcoroutinestate, но они предоставляют информацию только о том, создан ли генератор/сопрограмма, работает, приостановлен или закрыт. В случае, если состояние RUNNING, я хочу иметь возможность проверить фактический номер строки, который выполняет генератор или сопрограмма, и кадры стека, которые соответствуют другим функциям, которые он мог вызвать. В случае, если это SUSPENDED, я хочу изучить другие генераторы/сопрограммы, на которые он отправил данные.

Редактировать: Я нашел связанный question on SO, который указал мне на этот excellent article, который объясняет все, о чем я просил в этом вопросе.

+0

Вы пытались отобразить стек в точке останова или вызывать 'traceback.print_stack()' в обработчике исключений внутри сопрограммы 'async def'? –

+0

@AndrewSvetlov Да. Все, что я вижу в стеке, это цикл событий в нижней части стека, код обработчика события посередине и фактический код асинхронной сопрограммы в верхней части стека. Я ничего не вижу о других сопрограммах. Кажется, что должен быть другой стек или что-то еще, но я не могу даже представить четкую картину в своем уме. – max

ответ

1

Вам нужно всего лишь найти все экземпляры генераторов и ко-подпрограмм во всех «традиционных» кадрах (либо искать их рекурсивно во всех объектах во всех кадрах, либо пытаться использовать сборщик мусора (gc) модуль, чтобы получить ссылку на все эти экземпляры)

Генераторы и совместные подпрограммы имеют соответственно атрибут gi_frame и cr_frame.

+1

И, по-видимому, '.gi_yieldfrom' и' .cr_await', чтобы помочь перемещаться по иерархии генераторов/сопрограмм. – max

 Смежные вопросы

  • Нет связанных вопросов^_^