Python_学习之多协程
一、yield和yield from区别二、gevent构建多协程三、asyncio构建多协程1、名词简介2、常用方法(api)LoopawaitTaskFuture3、asyncio 通过yield from构建多任务协程4、asyncio通过async和await【官方推荐】5、asyncio.run() 构建循环事件【官方推荐】6、实例操作6.1、批量异步处理类型相同的数据?6.2、希望不等待所有完成了才对结果处理,而是消费了就对结果进行处理?6.3、动态的异步消费,比如动态接收mq或redis插入的数据?6.4、如何将线程池或进程池与协程一起用,且让不支持协程的模块支持?6.5. 在flask中应用6.6、代替requests实现的aiohttp支持异步
协程又称微线程,是一种用户态的上下文切换技术,由程序(用户)自身控制代码与代码之间的切换,效率高,安全,无锁机制。
Python中实现的方式主要以下几种:
yield,
greenlet为第三方模块【没有解决遇IO自动切换,只是阻塞】,生产中主要用gevent模块来实现
asyncio,Python3.4引入的模块【主流】
async&awiat ,Python3.5中引入的两个关键字,结合asynio模块使用【主流】
一、yield和yield from区别
二、gevent构建多协程
安装
三、asyncio构建多协程
官方文档:https://docs.python.org/zh-cn/3.8/library/asyncio.html
借用廖雪峰老师的话,asyncio的编程模型就是一个消息循环,我们从模块中直接获取一个的引用,然后把需要执行的协程扔到中执行,就实现了异步IO。
Python3.4引入,通过装饰器标识函数是一个协程,使用来驱动即遇IO切换到另一个任务。
1、名词简介
异步IO:发起一个IO操作,因其耗时,不用等其结束,可以做其他的事情,结束时会发来通知告知。
事件循环loop:管理所有的事件【任务】,在整个程序运行过程中不断循环执行并追踪事件发生的顺序将它们放到队列中,空闲时,调用相应的事件处理者来处理这些事件。
任务对象Task:是Future的子类,作用是将一个协程打包成一个task对象,为这个协程自动排一个日程准备立即执行,并追踪其状态。
结果对象Future:表示一个异步运算的最终结果的处理,asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。
可等待对象:如果一个对象可以在语句中使用,那么他就是可等待对象。主要有三种类型:、、
2、常用方法(api)Loop
获取一个标准事件循环loop对象,所有协程都是通过它来循环作业的,可以把它理解为一个队列
阻塞调用,入参为Future对象,作用是运行所有的协程,直到所有的协程都处理完了返回结果或异常才结束。
关闭事件循环,清除所有队列并立即关闭执行器,不会等没有完成的任务完成,幂等【相同的参数执行相同的函数结果必须一样】不可逆。
await
asyncio.wait(可等待对象awaitable,timeout=None)
内部将我们传入的任务封装成task对象,返回值为元祖,一个为完成的done列表,一个为还未完成的pending列表,如果设置timeout,在规定时间内,没返回的都放到未完成列表中,协程返回的结果顺序是无序的,完成的结果调用方法获取任务的返回值
asyncio.gather(可等待对象)
功能通asyncio.wait(),但返回的结果顺序,是按放入任务的顺序,有序的
asyncio.sleep(秒数,result="默认返回的结果")
模拟IO操作,这种休眠不会阻塞事件循环,前面加上await后将控制权交给主事件循环,不能用time.sleep(),因其会释放GIL,从而阻塞整个主线程,继而阻塞整个事件循环。
Task
Task:是Future的子类,作用是将一个协程打包成一个task对象,为这个协程自动排一个日程准备立即执行【白话就是将多个协程任务,排一个时间表自动并发的执行(遇到io就自动切另一个任务)】。
底层接口:loop.create_task()
将一个协程打包为一个task,排入日程准备执行,返回task对象,Python3.7加入的,3.7之前通过实现
Future
Future:表示一个异步运算的最终结果,是一个awaitable对象,协程可以等待 Future 对象直到它们有结果或异常集合或被取消。在 asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。
3、asyncio 通过yield from构建多任务协程
Python3.4引入,通过装饰器标识函数是一个协程,使用来驱动即遇IO切换到另一个任务。
4、asyncio通过async和await【官方推荐】
python3.5后官方推荐为了区分生成器和协程,其实就是将 换成了,换成了
5、asyncio.run() 构建循环事件【官方推荐】
python3.7才有run方法
6、实例操作
6.1、批量异步处理类型相同的数据?
6.2、希望不等待所有完成了才对结果处理,而是消费了就对结果进行处理?
6.3、动态的异步消费,比如动态接收mq或redis插入的数据?
6.4、如何将线程池或进程池与协程一起用,且让不支持协程的模块支持?
6.5. 在flask中应用
6.6、代替requests实现的aiohttp支持异步
pip install aiohttp
官方文档:https://docs.aiohttp.org/en/stable/
领取专属 10元无门槛券
私享最新 技术干货