我在试着理解asyncio是如何工作的。至于I/O操作,我了解到当await被调用时,我们在EventLoop中注册Future对象,然后为属于Future对象的get套接字调用epoll,准备给我们提供数据。在我们运行注册回调并恢复函数执行之后。
但是,我不能理解的是,如果我们使用await而不是for I/O操作,会发生什么。eventloop如何理解该任务已完成?它是为此创建套接字还是使用另一种循环?是否使用epoll?或者它不是添加到循环中并将其用作生成器吗?
下面是一个例子:
import asyncio
async def test():
return 10
async def my_coro(delay):
loop = asyncio.get_running_loop()
end_time = loop.time() + delay
while True:
print("Blocking...")
await test()
if loop.time() > end_time:
print("Done.")
break
async def main():
await my_coro(3.0)
asyncio.run(main())发布于 2021-03-17 15:57:32
await不会自动屈从于事件循环,只有当异步函数(在等待链中的任何位置)请求暂停时才会发生这种情况,通常是由于IO或超时未准备就绪。
在您的示例中,事件循环永远不会返回,您可以通过将“阻塞”打印移到while循环之前并将main更改为await asyncio.gather(my_coro(3.0), my_coro(3.0))来轻松验证这一点。您将看到协程是串行执行的(“阻塞”,然后是“完成”,都重复两次),而不是并行执行(“阻塞”,然后是另一个“阻塞”,然后是两次“完成”)。这样做的原因是没有机会进行上下文切换- my_coro一口气执行,就像它们是一个普通函数一样,因为它的等待都没有选择暂停。
https://stackoverflow.com/questions/66667599
复制相似问题