asyncio事件循环是否仅运行任务?

2024-09-27 23:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正处于学习asyncio库的早期阶段。我从协同程序和任务开始,阅读docs中的hello world示例

根据关于协同路由的部分,似乎有两种主要的方式来运行协同路由对象:

  • 在协同程序上使用await
  • 以asyncioTasks的形式运行协同路由

根据{a3}文件:

Tasks are used to run coroutines in event loops.

很清楚,这是否意味着事件循环不会运行协同路由对象,除非它们被包装到任务中?在这种情况下,这些协程对象是否只是同步运行,而不与事件循环进行任何交互


Tags: 对象asyncio示例docs路由helloworld方式
1条回答
网友
1楼 · 发布于 2024-09-27 23:23:56

To be clear, does this [that tasks are used to run coroutines] imply the event loop doesn't run coroutine objects unless they are wrapped into a task?

这意味着任务是进入协同程序世界的入口点。每个协同程序都可以追溯到被外部协同程序等待,一直到由任务驱动的协同程序

以以下代码为例:

async def inner():
    await asyncio.sleep(1)

async def outer():
    await inner()
    await inner()

async def main():
    await outer()

asyncio.run(main())

asyncio.run隐式创建一个任务来驱动main协程完成。该任务只“看到”通过调用main()创建的协同路由对象,而与等待的协同路由main无关。从任务的角度来看,main将挂起两次,每次sleep挂起一次。在挂起之前,sleep协程将与事件循环一起安排要恢复的任务

In this situation, are these coroutine objects just run synchronously without any interaction with the event loop?

所有协同程序都必须与事件循环交互,因为它们必须能够挂起。如果它们被另一个协同路由等待,则会导致等待的协同路由暂停。这会传播到由任务运行的顶级协同路由,并导致任务挂起

相关问题 更多 >

    热门问题