Python中的Asyncio类似于Boost。C++中的Asio。
异步IO是指你发起一个IO操作,可以继续做其他事情,而不用等它结束。结束后会通知你。
Asyncio是一种并发方式。对于Python来说,并发也可以通过线程和多处理来实现。
Asyncio没有带来真正的并行。当然,因为GIL(全局解释器锁),Python的多线程并不能带来真正的并行。
可以交给asyncio执行的任务叫做协同任务。一个协同过程可以放弃执行,而将机会让给其他协同过程(即从或等待中产生)。
定义协同
协同学的定义需要Async def语句。
做一些工作是一个协同的过程。
准确地说,do_some_work是一个协同函数,可以用asyncio.iscoroutinefunction来验证:
这个程序什么都没做。我们让它休眠几秒钟来模拟实际工作负载:
在解释等待之前,有必要解释一下协和能做什么。协调可以:
Asyncio.sleep也是一个协同过程,所以wait asyncio.sleep(x)只是在等待另一个协同过程。参见asyncio.sleep的文档:
运行协调
调用协同学函数,协同学不会开始运行,只会返回一个协同学对象,可以用asyncio.iscoroutine验证:
这里还有一个警告:
有两种方法可以让这个协同对象运行:
简单来说,只有循环运行,协同过程才能运行。
先获取当前线程的默认循环,然后把coordinator对象交给loop.run _直到_complete,然后coordinator对象就会在循环中运行。
Run _直到_complete是一个阻塞调用,直到协调器运行后才返回。这从函数名上不难看出。
run _直到_complete的参数是一个未来,但是我们在这里传递的是一个协同对象,之所以能够做到这一点,是因为内部进行了检查,并且通过survey _ future函数将协同对象包装成一个未来。因此,我们可以写得更清楚:
完整代码:
回调
如果协商是IO读操作,我们希望在它读完数据后得到通知,方便下一步的数据处理。这个需求可以通过向future添加回调来实现。
多重协同学
在实际项目中,经常有多个协同学同时在一个循环中运行。为了给循环提供多个协同学,需要asyncio . collect函数。
或者将协调过程放在列表的第一位:
运行结果:
这两个协同过程同时运行,因此等待时间不是1+3 = 4秒,而是更长的时间。
参考函数集合的文档:
发现也可以传递未来给它:
聚集作为一种聚合,将多个未来打包成一个未来,因为loop.run _直到_complete只接受一个未来。
运行_直到_完成并运行_永远
我们已经通过run _直到_complete运行了循环,当未来结束时,run _直到_complete将返回。
现在改为使用run _ every:
三秒后,未来结束,但程序不会退出。Run_forever将一直运行,直到调用stop,但您不能按如下方式调整stop:
Run_forever不返回,stop永远不会被调用。因此,停止只能在协调过程中进行调整:
如果有多个协同学在循环中运行,这并非没有问题:
这个循环在第二架协和式飞机结束之前停止了--被第一架结束的协和式飞机停止了。
为了解决这个问题,您可以使用聚集将多个协同程序合并到一个未来,添加一个回调,然后停止回调中的循环。
但如果关闭,它就不能再运行:
建议调用loop.close彻底清洗循环对象,以防误用。
收集与等待
asyncio . collect和asyncio.wait具有类似的功能。
见StackOverflow:asyncio . collect vs asyncio .等具体区别。
计时器
C++ Boost。AsIO提供IO对象定时器,但是Python本身不支持定时器,但是可以通过asyncio.sleep来模拟..
*声明:推送的内容和图片来自互联网,部分内容会有改动,版权归原作者所有。如果来源信息有误或侵犯权益,请联系我们进行删除或授权。
-结束-
1.《asyncio Python 的异步 IO:Asyncio 简介》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《asyncio Python 的异步 IO:Asyncio 简介》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/1520003.html