python-asyncio:走协程链

标签 python python-asyncio coroutine

我想检查正在运行的协同程序中的 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/

相关文章:

python - 从另一个线程调度异步协程,无需大量回调和同步等待

Python websockets lib客户端持久连接(带类实现)

python - 在 python 中加速 int 列表到二进制的转换

python - 无法从 pywinauto 导入 : ImportError: DLL load failed while importing win32ui: A dynamic link library (DLL) initialization routine failed

python - Pyspark:K表示模型拟合时的聚类误差

android - 方法声明 kotlin async{}

android - 使用协程更新 UI 异步调用

python - 为什么我的程序卡在线程上?

Python队列链接对象运行异步协程与主线程输入

python - 如何处理协程函数的多个结果?