发布于 2020-05-17 18:58:36
要明确的是,这是否意味着除非任务被包装到一个任务中,否则事件循环不会运行协同任务对象?
这意味着任务是进入协同世界的切入点。每个协同线都可以追溯到外部协同线等待的过程,直到任务驱动的协同线为止。
以下面的示例代码为例:
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()
创建的coroutine对象,而与coroutine main
无关。从任务的角度来看,main
将挂起两次,每次sleep
挂起一次。在挂起之前,sleep
协同器将与事件循环一起安排任务恢复。
在这种情况下,这些协同对象是否只是同步运行,而没有与事件循环进行任何交互?
所有协同必须与事件循环交互,因为它们必须能够挂起。如果它们被另一个协同线所等待,它们将导致等待的协同线暂停。这会传播到由任务运行的顶级协同线,从而导致任务挂起。
https://stackoverflow.com/questions/61853978
复制相似问题