勘误,昨天文章中的知识性错误

简介: 勘误,昨天文章中的知识性错误

摄影:产品经理暴雨前的宁静

在昨天的文章里面,我说asyncio.create_task(异步函数())并没有真正运行。

这犯了一个知识性错误。实际上这样写,异步函数里面的代码运行了。例如:

当我们执行异步函数()时,它返回的是一个coroutine对象,此时这个异步函数里面的代码是没有运行的。但是当把 coroutine 对象传入asyncio.create_task()时,异步函数里面的代码就已经开始运行了。

但是,如果我们直接把昨天代码里面的 asyncio.gather 去掉,也会导致报错,如下图所示:


可以看到,两个内部不含 await 的异步函数成功执行了,但是调用 aiohttp 的两个异步函数却报错了。

这是由于,当我们的代码运行到第32行时,它并不会停下来,而是直接退出了 aiohttp 的缩进,此时,aiohttp 的 Session 就已经关闭了。过了一会,网站请求的返回才回来,可是由于 Session 关闭,于是导致报错。

在这个例子里面,由于我们知道哪个异步任务最耗时,所以我们可以人工等待它:

此时程序就能正常运行了。这里看起来就像调用多线程里面的.join()一样。当我们调用 await 任务的时候,程序一定会在第33行等待5秒延迟的这个任务。一开始的时候我们有4个异步任务,asyncio 在这四个任务之间调度。后来前3个任务都结束了,asyncio 就直接等着最后一个任务结束。等到5秒延迟返回了,程序才会退出 aiohttp 的缩进。所以程序就不会报错了。

但在实际使用中,我们可能并不知道哪个异步任务耗时最久,所以有两种解决方案:

第一种是模拟多线程的情况,写一个循环,执行一个很长的睡眠时间,或者直接死循环:

但这种方案有个弊端,就是可能真正的任务已经全部运行完了,你循环的时间还没有结束。

第二种方案,跟昨天一样,使用asyncio.gather,这样可以保证所有任务运行完成以后,立刻返回。并且,asyncio.gather不仅能接受异步任务,也能直接接收coroutine对象:

当我们不使用asyncio.gather时,其实代码的运行逻辑就跟 JavaScript 原生的异步相差不大了。

最后,感谢🐳klew指出昨天文章中的问题。

目录
相关文章
|
9月前
昨天新学的小理解
int可自动转化为double类型,long不行,float可自动转化为double,int需要强制转为float。 自动类型转换指的是容量小的数据类型自动转化为容量大的数据类型。 int转为float可能会有精度的损失.
43 0
|
8月前
|
Python
|
9月前
|
安全 网络协议 Java
【紧急】Log4j又发新版2.17.0,只有彻底搞懂漏洞原因,才能以不变应万变,小白也能看懂
经过一周时间的Log4j2 RCE事件的发酵,事情也变也越来越复杂和有趣,就连 Log4j 官方紧急发布了 2.15.0 版本之后没有过多久,又发声明说 2.15.0 版本也没有完全解决问题,然后进而继续发布了 2.16.0 版本。大家都以为2.16.0是最终终结版本了,没想到才过多久又爆雷,Log4j 2.17.0横空出世。
228 0
|
缓存 Java 数据库连接
Myabtis源码如何阅读,教你一招!!!
Myabtis源码如何阅读,教你一招!!!
|
机器学习/深度学习 算法 编译器
明天省赛,我都还不太熟悉Dev - C++,怎么切换成C++11了?它的报错看不懂呀,那花八分钟看看这篇文章吧~解决你的困惑。
明天省赛,我都还不太熟悉Dev - C++,怎么切换成C++11了?它的报错看不懂呀,那花八分钟看看这篇文章吧~解决你的困惑。
707 0
明天省赛,我都还不太熟悉Dev - C++,怎么切换成C++11了?它的报错看不懂呀,那花八分钟看看这篇文章吧~解决你的困惑。
|
数据挖掘
2020年小美赛题目B题翻译(参考就行,我没参加比赛,纯属兴趣使然)
2020年小美赛题目B题翻译(参考就行,我没参加比赛,纯属兴趣使然)
145 0
2020年小美赛题目B题翻译(参考就行,我没参加比赛,纯属兴趣使然)
|
XML 存储 数据可视化
做时间的朋友 —— 用印象笔记打造时间记录工具
做时间的朋友 —— 用印象笔记打造时间记录工具
514 0
|
测试技术 应用服务中间件 数据库
CTO 点名要搞个灰度发布系统,不慌!
互联网产品需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题可以很快控制影响面,就需要设计一套灰度发布系统。
CTO 点名要搞个灰度发布系统,不慌!
|
存储 Windows
明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
231 0
明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
|
机器学习/深度学习 移动开发 运维
X6 1.0 抱歉来晚
图编辑也是图领域一个重要方向,许多流程图、关系图绘制场景都需要它。基于蚂蚁内部的机器学习算法建模平台多年的可视编排能力打磨,我们决定把其中的图编辑内核抽取出来,图编辑 X6。
X6 1.0 抱歉来晚