Python协程&asyncio

2022-08-31 07:55:29

什么是协程

1、协程作用
协程不是计算机自带的功能,而是人们的一种理念,协程的主要作用就是:当你的程序遇到了阻塞(耗时操作)时,程序在等待当前程序运行时顺便去执行另一程序

比如在爬虫的过程中,你爬取别的的视频或图片的时候,初级的程序就是循环遍历,一张一张爬取,而协程操作就会在下载等待第一张图片的同时下载第二张…实现协程异步爬虫

协程的实现

1、greenlet实现协程
from greenletimport greenletdeffun1():print("第一条语句!")
    gr2.switch()print("第二条语句! ")
    gr2.switch()deffun2():print("第三条语句! ")
    gr1.switch()print("第四条语句! ")


gr1= greenlet(fun1)
gr2= greenlet(fun2)

gr1.switch()

打印结果:

第一条语句!
第三条语句! 
第二条语句! 
第四条语句!

创建两个greenlet对象(gr1 gr2)一个greenlet就相当于一个微线程,在程序执行时调用switch函数,跳转到另一greenlet中,反复横跳。实现线程作用。

2、yield实现协程
deffuna1():yield1yieldfrom funa2()yield2deffuna2():yield3yield4


f= funa1()for itemin f:print(item)

运行结果:

1342

有yield的函数体返回的是一个“迭代器”,借用关键字“yield”的特点,让当前语句返回数字后挂起,相当于return语句,但不同的是当再次调用时会从yield关键字下一句开始执行,通过若干yield关键字俩实现协程处理,但该方法不常用与实现协程。

3、asyncio&await实现协程
import asyncioasyncdeffunc1():print("第一条语句!")await asyncio.sleep(2)print("第二条语句! ")asyncdeffunc2():print("第三条语句! ")await asyncio.sleep(2)print("第四条语句! ")


test=[
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())]# 生成一个事件循环
loop= asyncio.get_event_loop()# 将asyncio.wait(test)放到列表中依次执行直到结束
loop.run_until_complete(asyncio.wait(test))

运行结果:

第一条语句!
第三条语句! 
第二条语句! 
第四条语句!

通过“asyncio”实现协程是最常用的方法,但仅限于python3.4版本及以后,上面的await方法配合使用是python3.8版本开始的使用。python3.7后 后两句可换为 asyncio.run(test)。

  • 作者:独角兽小马
  • 原文链接:https://blog.csdn.net/weixin_44457673/article/details/117367176
    更新时间:2022-08-31 07:55:29