Table of Contents
- 协程不是计算机中真实存在的,程序员创造的
- 微线程,上下文切换的技术
- 用一个线程在代码之间游走运行,在函数之间进行切换
-
greenlet早期模块
-
from greenlet import greenlet def fun1(): print(1) gr2.swich() print(2) gr2.swich() def fun2(): print(3) gr1.swich() print(4) gr1.swich() gr1 = greenlet(func1) gr2 = greenlet(func2) gr1.switch()
-
-
greenevent 基于greetlet
- 补充
-
yield 可以伪造成一个协程
-
def func1(): yield 1 yield from func2() yield 2 def func2(): yield 3 yield from fun1() yield 4 f1 = func1() fro item in f1: print(f1)
-
-
asyncio 通过装饰器(py3.4)
- 优势:遇到io阻塞,自动切换
-
# 比如下载图片是时候可以自动切换 import asyncio @asyncio.coroutine def func1(): print(1) # 网络io请求 yield from asyncio.sleep(2) print(2) @asycnio.coroutine def func2(): print(3) # 网络io请求 yield from asyncio.sleep(2) print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()), ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait())
-
async、await 关键字 (py3.5) 主流
- 跟asyncio差不多
- 改变装饰器为async 改yield为await
-
# 比如下载图片是时候可以自动切换 import asyncio async def func1(): print(1) # 网络io请求 await from asyncio.sleep(2) print(2) async def func2(): print(3) # 网络io请求 await from asyncio.sleep(2) print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()), ] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait())
协程的意义
- 一个线程中,遇到IO等待的时间,在去干点别的事情(任务)
- 异步请求url,异步下载
异步编程
- 时间循环 (死循环) 检测执行某些代码
-
# 伪代码 任务列表 = [] while True: for 就绪任务 in 可执行任务 执行就绪任务 for 已完成任务 in 已完成的任务列表 任务列表中移除已完成任务 任务列表为空,循环终止 # 时间循环 import asyncio loop = asyncio.get_event_loop() # for循环 loop.run_until_complete() # 添加任务
快速上手
- 协程函数:(事件循环结合)
- 定义函数的时候async def 函数名 就是协程函数
- 协程对象 协程函数() == 协程对象
-
async def func(): pass result = func() # 函数并不执行,跟yield一样,跟事件循环结合 # 让时间循环去执行事件 loop = asyncio.get_event_loop() # for循环 loop.run_until_complete(result) # 添加任务 # asyncio.run(result) python3.7之后可以使用
-
await
- await + 可等待的对象(协程对象,Tuture,Task对象)
-
import asyncio async def func(): print("开始") response = await asyncio.sleep(2) print("结束") asyncio.run(func())
-
import asyncio async def others(): print("start") await asyncio.sleep(2) print("end") return "返回值" async def func(): print("start 协程") response1 = await others() print("io"+response1) response2 = await others() print("io"+response2) asyncio.run(func())
- await就是等待对象的值,得到结果之后再继续走