С обычными вызовами функций состояние программы в основном описывается простым стеком вызовов. Он распечатывается как след после неперехваченного исключения, его можно проверить с помощью inspect.stack
и его можно отобразить в отладчике после точки останова.Как проверить состояние программы в присутствии генераторов/сопрограмм?
В присутствии генераторов, кулеров на основе генераторов и async def
на основе сопрограммы, я не думаю, что стека вызовов достаточно. Каков хороший способ мысленно визуализировать состояние программы? Как проверить его во время выполнения?
Есть функции inspect.getgeneratorstate
и inspect.getcoroutinestate
, но они предоставляют информацию только о том, создан ли генератор/сопрограмма, работает, приостановлен или закрыт. В случае, если состояние RUNNING
, я хочу иметь возможность проверить фактический номер строки, который выполняет генератор или сопрограмма, и кадры стека, которые соответствуют другим функциям, которые он мог вызвать. В случае, если это SUSPENDED
, я хочу изучить другие генераторы/сопрограммы, на которые он отправил данные.
Редактировать: Я нашел связанный question on SO, который указал мне на этот excellent article, который объясняет все, о чем я просил в этом вопросе.
Вы пытались отобразить стек в точке останова или вызывать 'traceback.print_stack()' в обработчике исключений внутри сопрограммы 'async def'? –
@AndrewSvetlov Да. Все, что я вижу в стеке, это цикл событий в нижней части стека, код обработчика события посередине и фактический код асинхронной сопрограммы в верхней части стека. Я ничего не вижу о других сопрограммах. Кажется, что должен быть другой стек или что-то еще, но я не могу даже представить четкую картину в своем уме. – max