首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python-asyncio:沿着协程链条走

python-asyncio:沿着协程链条走
EN

Stack Overflow用户
提问于 2017-09-17 06:00:35
回答 1查看 373关注 0票数 5

我想从一个正在运行的协程中检查await调用链。我的目标是向我的用户呈现一个图形,其中的协程在我支持的应用程序中相互调用。但是,简单的堆栈是行不通的,因为协程可能会并发运行。

下面是我使用cr_wait遍历堆栈所做的快速测试。我在here中看到了这种方法,但它没有产生我预期的结果。

代码语言:javascript
复制
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“。我曾经(也许是天真地)期望看到:

代码语言:javascript
复制
bar
foo
run

我查看了Task.get_stack,但文档指出,此方法将为所有挂起的协程返回单个帧,这似乎没有那么有用。

有没有办法让我得到完整的协程堆栈?

EN

回答 1

Stack Overflow用户

发布于 2018-04-25 17:22:43

我不知道这是否满足你的问题,但你可以做的是遍历帧:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46258800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档