Python中实现协程的三种方式
协程
协程,简而言之,就是通过一个线程实现代码块相互切换执行。
协程的意义:在一个线程中如果遇到IO等待时间,线程不会傻傻等,利用空闲时间再去干点其他事
实现协程的几种方法:
1.yield关键字
2.asyncio装饰器(3.4版本)
3.async,await关键字(3.5版本后,推荐使用)
1.yield关键字
def func1(): yield 1; yield from func2() #跳到func2函数里面 yield 2 def func2(): yield 3 yield 4 f1=func1() for item in f1:#每次循环,执行里面的yield print(item)
如果一个函数里面有yield关键字,我们就认为是生成器函数,只要执行函数,返回的就是生成器
但是在真正实现协程,我们不会用这种方式,这里了解即可。
2.asyncio装饰器(3.4版本)
import asyncio @asyncio.coroutine def func1(): print(1) yield from asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务 print(2) @asyncio.coroutine def func2(): print(3) yield from 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))
asyncio模块的特别之处在于遇到了yield from后面的IO操作,它不会傻傻地等,它会切换任务
实际应用:比如我要下载很多图片,在发送下载一张图片的请求后等待响应的时候,线程可以继续发送其它下载图片的请求,这时就可以节省很多时间
3.async,await关键字(3.5版本后,推荐使用)
import asyncio async def func1(): print(1) await asyncio.sleep(2) #遇到IO耗时操作,自动化切换到tasks中的其他任务 print(2) async def func2(): print(3) 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))
这个完成的功能和asyncio装饰器其实是一样的,本质上就是把装饰器和yield from换成async 和 await,更加方便使用而已
到此这篇关于Python中实现协程的三种方式的文章就介绍到这了,更多相关Python协程实现方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决办法
这篇文章主要给大家介绍了关于PyCharm使用matplotlib报MatplotlibDeprecationWarning问题解决的相关资料,主要是 matplotlib版本过高导致的,文中通过图文介绍的非常详细,需要的朋友可以参考下2023-06-06


最新评论