Python异步编程7:异步迭代器迭代器:在其内部实现yield方法和next方法的对象 。可迭代对象:在类内部实现一个iter方法,并返回一个迭代器 。
异步迭代器:实现了__aiter__()和__anext__()方法的对象,必须返回一个awaitable对象 。async_for支持处理异步迭代器的
__anext__()方法返回的可等待对象,直到引发一个stopAsyncIteration异常,这个改动由PEP 492引入 。
异步可迭代对象:可在async_for语句中被使用的对象,必须通过它的__aiter__()方法返回一个asynchronous_iterator(异步迭代器).这个改动由PEP 492引入 。
示例: 不能直接写在普通方法或者暴露在外面 。必须写在协程函数,任意协程函数均可 。
Python异步编程全攻略如果你厌倦了多线程,不妨试试python的异步编程,再引入async, await关键字之后语法变得更加简洁和直观,又经过几年的生态发展,现在是一个很不错的并发模型 。
下面介绍一下python异步编程的方方面面 。
因为GIL的存在,所以Python的多线程在CPU密集的任务下显得无力,但是对于IO密集的任务 , 多线程还是足以发挥多线程的优势的,而异步也是为了应对IO密集的任务,所以两者是一个可以相互替代的方案,因为设计的不同 , 理论上异步要比多线程快 , 因为异步的花销更少, 因为不需要额外系统申请额外的内存 , 而线程的创建跟系统有关 , 需要分配一定量的内存,一般是几兆,比如linux默认是8MB 。
虽然异步很好,比如可以使用更少的内存,比如更好地控制并发(也许你并不这么认为:)) 。但是由于async/await 语法的存在导致与之前的语法有些割裂,所以需要适配,需要付出额外的努力,再者就是生态远远没有同步编程强大,比如很多库还不支持异步,所以你需要一些额外的适配 。
为了不给其他网站带来困扰,这里首先在自己电脑启动web服务用于测试,代码很简单 。
本文所有依赖如下:
所有依赖可通过代码仓库的requirements.txt一次性安装 。
首先看一个错误的例子
输出如下:
发现花费了3秒,不符合预期呀 。。。。这是因为虽然用了协程,但是每个协程是串行的运行,也就是说后一个等前一个完成之后才开始,那么这样的异步代码并没有并发,所以我们需要让这些协程并行起来
为了让代码变动的不是太多,所以这里用了一个笨办法来等待所有任务完成, 之所以在main函数中等待是为了不让ClientSession关闭, 如果你移除了main函数中的等待代码会发现报告异常RuntimeError: Session is closed,而代码里的解决方案非常的不优雅 , 需要手动的等待,为了解决这个问题,我们再次改进代码 。
这里解决的方式是通过asyncio.wait方法等待一个协程列表,默认是等待所有协程结束后返回 , 会返回一个完成(done)列表,以及一个待办(pending)列表 。
如果我们不想要协程对象而是结果,那么我们可以使用asyncio.gather
结果输出如下:
通过asyncio.ensure_future我们就能创建一个协程,跟调用一个函数差别不大,为了等待所有任务完成之后退出 , 我们需要使用asyncio.wait等方法来等待,如果只想要协程输出的结果,我们可以使用asyncio.gather来获取结果 。
虽然前面能够随心所欲的创建协程,但是就像多线程一样 , 我们也需要处理协程之间的同步问题 , 为了保持语法及使用情况的一致,多线程中用到的同步功能,asyncio中基本也能找到, 并且用法基本一致,不一致的地方主要是需要用异步的关键字 , 比如async with/ await等
推荐阅读
- 赛车游戏有利于考驾照嘛,赛车游戏好不好
- 怎么解决U盘在电脑不显示,怎么解决u盘在电脑不显示文件
- 游戏男女格斗,男女终极格斗游戏
- mysql怎么敲命令 mysqld命令
- 谷歌鸿蒙系统好吗,谷歌 鸿蒙
- ppt的文件怎么打开,ppt文件怎么打开不变 字体
- python测试工程师工资怎么样,python工资怎么样
- linux命令如何调出来 linux系统如何调出命令窗口
- 视频号值得重做吗怎么做,视频号可以重复吗