目录
开门见山: 协程:最通俗解释: 同一个线程间 函数 执行来回切换. (上下文切换技术)
就是说, 通过一个线程实现代码块相互切换执行.
如何实现协程?
- greenlet,是一个第三方模块,用于实现协程代码(Gevent协程就是基于greenlet实现)
- yield,生成器,借助生成器的特点也可以实现协程代码。
- asyncio,在Python3.4中引入的模块用于编写协程代码。
- async & awiat,在Python3.5中引入的两个关键字,结合asyncio模块可以更方便的编写协程代码。
Python3.8之后 @asyncio.coroutine
装饰器就会被移除,推荐使用async & awit 关键字实现协程代码。
import asyncio
async def fun1():
print(1)
await asyncio.sleep(2)
print(2)
async def fun2():
print(3)
await asyncio.sleep(2)
print(4)
tasks = [
asyncio.ensure_future(fun1()),
asyncio.ensure_future(fun2()),
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
运行结果:
协程的意义
计算型的操作,利用协程来回切换执行,没有任何意义,来回切换并保存状态 反倒会降低性能。
IO型的操作,利用协程在IO等待时间就去切换执行其他任务,当IO操作结束后再自动回调,那么就会大大节省资源并提供性能,从而实现异步编程(不等待任务结束就可以去执行其他代码)。
换句话说, 每个线程如果遇到IO等待时间,线程不会傻傻等待IO结束,而是利用CPU空闲的时候做其他事 也就是异步.