栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

asyncio模块如何工作,为什么我的更新样本同步运行?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

asyncio模块如何工作,为什么我的更新样本同步运行?

Asyncio使用 事件循环 ,该 循环 选择队列中要激活的 任务
(协程的独立调用链)。事件循环可以明智地决定准备执行实际任务的任务。这就是为什么事件循环还负责创建连接并监视文件描述符和其他I / O原语的原因。它使事件循环可以洞悉何时正在进行I /
O操作或何时可以处理结果。

无论何时使用

await
,都有机会将控制权返回到循环,然后可以将控制权传递给另一个任务。然后选择执行哪个任务取决于确切的实现。该
asyncio
参考实现提供了多种选择,但也有其他的实现,如非常,非常有效uvloop实现。

您的示例 仍然异步的
。碰巧的是,通过在新的协程函数内部

await.sleep()
用同步
time.sleep()
调用替换,您在任务调用链中引入了两个不屈服的协程,从而影响了它们执行的顺序。以似乎同步的顺序执行它们是一个
巧合 。如果您切换了事件循环,或引入了更多的协程(特别是一些使用I / O的协程),则顺序很容易再次不同。

而且,您的新协程使用

time.sleep()
;这会使你的协程 不合作
。不会通知事件循环您的代码正在等待(
time.sleep()
不会让步!),因此在运行时
无法执行其他协程
time.sleep()
time.sleep()
只是在请求的时间过去之后才 返回或让其他任何代码运行
。将此与
asyncio.sleep()
实现进行对比,该实现只是通过
call_later()
钩子产生了事件循环;
现在,事件循环知道该任务直到以后才需要注意。

另请参见asyncio:默认情况下为什么不进行非阻塞以更深入地讨论任务和事件循环的交互方式。而且,如果必须运行无法协作的
阻塞,同步代码 ,则可以使用执行程序池在单独的踏步或子进程中执行阻塞代码,以将事件循环释放给其他性能更好的任务。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/441206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号