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 可等待对象协程对象FutureTask对象task对象在事件循环中添加多个任务通过asyncio.create_task(协程对象)方法进行创建concurrent.future.Future对象使用进程池线程池实现异步操作用到的对象异步迭代器什么是异步迭代器实现了aiter() 和anext() 方法的对象。anext必须返回一个 awaitable 对象。async for 会处理异步迭代器的anext() 方法所返回的可等待对象直到其引发一个 StopAsyncIteration 异常什么是异步可迭代对象可在 async for 语句中被使用的对象。必须通过它的aiter() 方法返回一个 asynchronous iteratorclassReader(object): 自定义异步迭代器同时也是异步可迭代对象 def__init__(self):self.count0asyncdefreadline(self):# await asyncio.sleep(1)self.count1ifself.count100:returnNonereturnself.countdef__aiter__(self):returnselfasyncdef__anext__(self):valawaitself.readline()ifvalNone:raiseStopAsyncIterationreturnval异步上下文管理器此种对象通过定义__aenter__()和__aexit__()方法来对async with语句中的环境进行控制