博客园2023-03-29 22:25:07
协程不是计算机提供的,计算机只提供:进程、线程。协程时人工创造的一种用户态切换的微进程,使用一个线程去来回切换多个进程
实现协程的几种方法
(相关资料图)
greenlet:早期模块yield关键字:可以保存代码,保存状态asyncio装饰器(3.4)async、await关键字(3.5)【推荐】1.1greenlet实现协程pip install greenletfrom greenlet import greenletdef fun1(): gre2.switch()#切换到fun2 passdef fun2(): gre1.switch()#切换到fun1 passgre1 = greenlet(func1)gre2 = greenlet(func2)gre1.switch()#先去执行fun1
1.2yield关键字实现协程def func1(): yield 1 yield from func2() yield 2 def func2(): yield 3 yield 4f1 = func1()for item in f1: print(item,end=" ") #打印结果1 3 4 2
1.3使用asyncio模块实现协程再python3.4版本之后才可以用(不用安装,在标准库中)
import asyncio#使用该装饰器装饰后,该函数就是一个协程函数@asyncio.coroutinedef func1(): print(1) #遇到IO操作时,会自动切换到taks中的其他任务函数 yield from asyncio.sleep(2) print(2)@asyncio.coroutinedef func2(): print(3) yield from asyncio.sleep(2) print(4) #将两个协程函数封装成一个tasks列表tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2())]#loop = asyncio.get_event_loop()loop.run_until_complete(func1())
1.4async & await关键字实现协程import asyncio#使用该装饰器装饰后,该函数就是一个协程函数async def func1(): print(1) #遇到IO操作时,会自动切换到tasks中的其他任务函数 await asyncio.sleep(2) print(2)async def func2(): print(3) await asyncio.sleep(2) print(4) #将两个协程函数封装成一个tasks列表tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2())]loop = asyncio.get_event_loop()loop.run_until_complete(tasks)
2.协程意义在线程中如果遇到IO等待时间,线程不会傻等着,会利用空闲的时间去做其他事情,也就是进程异步执行。
#协程请求资源使用第三方库aiohttpimport aiohttp
3.异步编程3.1时间循环理解成一个死循环,去检测并执行某些代码
#伪代码任务列表 = [task1,task2...]while True: for 就绪任务 in 可执行任务列表: 执行 for 已完成任务 in 已完成任务列表: 从任务列表中删除import asyncio #生成一个书简循环loop = asyncio.get_event_loop()#将任务放到任务列表中loop.run_until_complete(任务)
3.2案例协程函数,
定义函数的时候,用async def 函数名
协程对象:执行协程函数的时候得到一个协程对象
async def func(): passresult = func()
注意:执行协程函数时得到的协程对象,函数内部代码不会执行
import asyncioasync def func(): print("哈喽")f = func()#协程对象loop = asyncio.get_event_loop()#创建循环对象loop.run_until_complete(f)#通过循环对象执行协程对象#python3.7可以直接asyncio.run(f)
3.3await关键字await + 可等待的对象 {协程对象,Future对象,Task对象} (类似于I O 等待)
import asyncioasync def func(): print("哈喽") re = await asyncio.sleep(2)print(re)asyncio.run(func())
await就是等待对象的值得到结果后再继续向下执行
import asyncioasync def other(): print("start") await asyncio.sleep(2) print("end") return 1async def fun(): print("执行协程函数内部代码") #遇到IO操作时会挂起当前协程任务,等IO操作完成后再继续往下执行,当前协程挂起时,时间循环对象可以执行其他协程任务 re = await other() print("IO请求结束,结果为:",re) asyncio.run(func())#执行结果 执行协程函数内部代码startendIO请求结束,结果为: 1
关键词: