Python协程&asyncio

什么是协程

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

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

协程的实现

1、greenlet实现协程
from greenlet import greenlet


def fun1():
    print("第一条语句!")
    gr2.switch()
    print("第二条语句! ")
    gr2.switch()


def fun2():
    print("第三条语句! ")
    gr1.switch()
    print("第四条语句! ")


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

gr1.switch()

打印结果:

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

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

2、yield实现协程
def funa1():
    yield 1
    yield from funa2()
    yield 2


def funa2():
    yield 3
    yield 4


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

运行结果:

1
3
4
2

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

3、asyncio&await实现协程
import asyncio


async def func1():
    print("第一条语句!")
    await asyncio.sleep(2)
    print("第二条语句! ")


async def func2():
    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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独角兽小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值