首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >asyncio如何理解非阻塞操作任务已完成

asyncio如何理解非阻塞操作任务已完成
EN

Stack Overflow用户
提问于 2021-03-17 13:47:22
回答 1查看 53关注 0票数 1

我在试着理解asyncio是如何工作的。至于I/O操作,我了解到当await被调用时,我们在EventLoop中注册Future对象,然后为属于Future对象的get套接字调用epoll,准备给我们提供数据。在我们运行注册回调并恢复函数执行之后。

但是,我不能理解的是,如果我们使用await而不是for I/O操作,会发生什么。eventloop如何理解该任务已完成?它是为此创建套接字还是使用另一种循环?是否使用epoll?或者它不是添加到循环中并将其用作生成器吗?

下面是一个例子:

代码语言:javascript
运行
复制
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())
EN

Stack Overflow用户

回答已采纳

发布于 2021-03-17 15:57:32

await不会自动屈从于事件循环,只有当异步函数(在等待链中的任何位置)请求暂停时才会发生这种情况,通常是由于IO或超时未准备就绪。

在您的示例中,事件循环永远不会返回,您可以通过将“阻塞”打印移到while循环之前并将main更改为await asyncio.gather(my_coro(3.0), my_coro(3.0))来轻松验证这一点。您将看到协程是串行执行的(“阻塞”,然后是“完成”,都重复两次),而不是并行执行(“阻塞”,然后是另一个“阻塞”,然后是两次“完成”)。这样做的原因是没有机会进行上下文切换- my_coro一口气执行,就像它们是一个普通函数一样,因为它的等待都没有选择暂停。

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

https://stackoverflow.com/questions/66667599

复制
相关文章

相似问题

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