1.1 greenlet
第三方模块
-
安装第三方模块
pip3 install greenlet
-
手动切换
-
示例
from greenlet import greenlet def func1(): print(1) gr2.switch() # 切换到 func2 函数 print(2) gr2.switch() # 切换到 func2 函数 def func2(): print(3) gr1.switch() # 切换到 func1 函数,从上一次执行的位置继续向后执行 print(4) gr1 = greenlet(func1) gr2 = greenlet(func2) gr1.switch() # 执行 func1 函数,完整打印:1 3 2 4
1.2 yield
关键字
-
利用生成器实现协程
-
手动切换
-
示例
def func1(): yield 1 yield from func2() # 切换到 func2 函数 yield 2 def func2(): yield 3 yield 4 f1 = func1() for item in f1: print(item) # 完整打印:1 3 4 2
1.3 asyncio
装饰器
-
通过内置的
asyncio
模块实现协程(Python3.4版本之后) -
遇到IO阻塞自动切换
-
示例
import asyncio @asyncio.coroutine def func1(): print(1) # 模拟网络IO请求:如下载一张图片 yield from asyncio.sleep(3) # 遇到IO耗时操作,自动化切换到tasks中的其他任务 print(2) @asyncio.coroutine def func2(): print(3) # 模拟网络IO请求:如下载一张图片 yield from asyncio.sleep(2) # 遇到IO耗时操作,自动化切换到tasks中的其他任务 print(4) # loop = asyncio.get_event_loop() # loop.run_until_complete(func1()) # 执行协程函数 func1 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) # 执行tasks任务列表中的协程函数,完整流程:[1 3] 4 2
1.4 async&await
关键字【推荐】
-
基于
async&await
关键字实现协程(Python3.5版本之后) -
功能同上,代码更加简洁
-
Python3.8之后
@asyncio.coroutine
装饰器被移除,推荐使用async&await
关键字实现协程 -
示例
import asyncio async def func1(): print(1) # 模拟网络IO请求:如下载一张图片 await asyncio.sleep(3) # 遇到IO耗时操作,自动化切换到tasks中的其他任务 print(2) async def func2(): print(3) # 模拟网络IO请求:如下载一张图片 await asyncio.sleep(2) # 遇到IO耗时操作,自动化切换到tasks中的其他任务 print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) # 执行tasks任务列表中的协程函数,完整流程:[1 3] 4 2