我想检查正在运行的协同程序中的 await
调用链。我的目标是向我的用户展示一个图表,其中协程在我支持的应用程序中相互调用。但是,一个简单的堆栈是行不通的,因为协程可能会同时运行。
这是我使用 cr_wait
遍历堆栈所做的快速测试。我看到了这个方法here , 但它没有产生我预期的结果。
from asyncio import get_event_loop
from asyncio import Task
def main():
loop = get_event_loop()
loop.run_until_complete(run())
async def run():
await foo()
async def foo():
await bar()
async def bar():
print_coro_stack(Task.current_task()._coro)
def print_coro_stack(coro):
if coro is None:
return
print(coro.__name__)
if coro.cr_await:
print_coro_stack(coro.cr_await)
if __name__ == '__main__':
main()
执行时,此代码仅打印“run”。我曾(也许天真地)期望看到:
bar
foo
run
我查看了 Task.get_stack
,但文档指出此方法将为所有挂起的协程返回一个帧,这似乎没那么有用。
有没有办法获得完整的协程堆栈?
最佳答案
我不知道这是否满足你的问题,但你可以做的是遍历框架:
from asyncio import get_event_loop
from asyncio import Task
import inspect
def main():
loop = get_event_loop()
loop.run_until_complete(run())
async def run():
await foo()
async def foo():
await bar()
async def bar():
print_frame_stack(inspect.currentframe())
def print_frame_stack(frame):
if frame is None:
return
print(frame.f_code.co_name)
if frame.f_back:
print_frame_stack(frame.f_back)
if __name__ == '__main__':
main()
关于python-asyncio:走协程链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46258800/