ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python学习日记四

Python学习日记四

协程

协程也可以被称为微线程,是一种用户态内的上下文切换技术,在开发中结合遇到IO自动切换,就可以通过一个线程实现并发操作。
所以在处理IO操作时,协程比线程更加节省开销。
协程在做处理做计算时,效率会低,因为协程只是在一个线程内。所以协程一般用作发网络IO请求

python3.4之后的版本
asyncio
通过@asyncio.coroutine装饰器实现协程

现在通过async & await关键字实现
在需要协程的函数名之前加上async关键字
在"可等待对象"之前加上await

通过asyncio.run()开启事件循环

事件循环

理解为一个死循环,去检测并执行某些代码
伪代码
任务列表 = [ 任务1, 任务2, 任务3,… ]

while True:
可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有的任务,将’可执行’和’已完成’的任务返回

for 就绪任务 in 已准备就绪的任务列表:
执行已就绪的任务

for 已完成的任务 in 已完成的任务列表:
在任务列表中移除 已完成的任务

如果 任务列表 中的任务都已完成,则终止循环

协程基础用法

协程函数:定义函数时async def 函数名
协程对象:执行协程函数()得到的协程对象
注意:执行协程函数创建协程对象,函数内部代码不会直接执行。
如果想要运行协程函数内部代码,必须要将协程函数对象笑给事件循环来处理。

await关键字
await + 可等待对象(协程对象,Future,Task对象)

task对象
在事件循环中添加多个任务
通过asyncio.create_task(协程对象)方法进行创建

concurrent.future.Future对象
使用进程池线程池实现异步操作用到的对象

异步迭代器

什么是异步迭代器?
实现了aiter() 和anext() 方法的对象。anext必须返回一个 awaitable 对象。async for 会处理异步迭代器的anext() 方法所返回的可等待对象,直到其引发一个 StopAsyncIteration 异常

什么是异步可迭代对象?
可在 async for 语句中被使用的对象。必须通过它的aiter() 方法返回一个 asynchronous iterator

classReader(object):""" 自定义异步迭代器(同时也是异步可迭代对象) """def__init__(self):self.count=0asyncdefreadline(self):# await asyncio.sleep(1)self.count+=1ifself.count==100:returnNonereturnself.countdef__aiter__(self):returnselfasyncdef__anext__(self):val=awaitself.readline()ifval==None:raiseStopAsyncIterationreturnval

异步上下文管理器

此种对象通过定义__aenter__()和__aexit__()方法来对async with语句中的环境进行控制

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进