首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过add_done_callback添加回调是在何时何地触发的?

通过add_done_callback添加回调是在何时何地触发的?
EN

Stack Overflow用户
提问于 2019-09-29 13:48:08
回答 1查看 213关注 0票数 1

我正在使用Visual Studio code (VSCode)调试器读取以下代码。

代码语言:javascript
运行
复制
import asyncio


async def main():
    print("OK Google. Wake me up in 1 seconds.")
    await asyncio.sleep(1)
    print("Wake up!")


if __name__ == "__main__":
    asyncio.run(main(), debug=False)

我可以理解安排回调以使进程休眠一秒钟的程序的主要流程,但很难理解何时或在何处调用_run_until_complete_cb

在执行主协程之后,通过将_stopping标志设置为True,调用此函数/回调来停止事件循环。但是,它最初是通过add_done_callback附加到Future类中的_callbacks内部属性的,或者在完成future后很快被调用。

代码语言:javascript
运行
复制
def add_done_callback(self, fn, *, context=None):
    """Add a callback to be run when the future becomes done.
    The callback is called with a single argument - the future object. If
    the future is already done when this is called, the callback is
    scheduled with call_soon.
    """
    if self._state != _PENDING:
        self._loop.call_soon(fn, self, context=context)
    else:
        if context is None:
            context = contextvars.copy_context()
        self._callbacks.append((fn, context))

无论哪种情况,它都通过call_soon方法注册到事件循环中,并在最后的下一次迭代中调用。但目前,未来还没有完成上面的else子句。

我的问题是,将来在哪里或者什么时候完成对else子句的_run_until_complete_cb?由于VSCode调试器只是跳过或忽略在Future和Task实例上调用方法的代码行,因此流程直接跳到_run_until_complete_cb中的call_soon中。

在完成主协程之后到底发生了什么?有没有人有关于异步模块的清理过程来停止事件循环的任何想法或提示,或者有办法通过VSCode调试器来查看Future或Task的方法?

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2019-10-01 07:40:05

如果你正在尝试调试到asyncio,那么你想要set "justMyCode": true in your launch.json。这将使调试器跟踪第三方代码,包括stdlib。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58152617

复制
相关文章

相似问题

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