Python协程的四种实现方式

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

今天继续给大家介绍Python关知识本文主要内容是Python协程的四种实现方式。

一、yield关键字实现方式

以yield关键字方式实现协程代码如下所示

def fun1():
    yield 1
    yield from fun2()
    yield 2

def fun2():
    yield 3
    yield 4

f1=fun1()
for item in f1:
    print(item)

在上述代码中一个Python函数中存在由yiled就说明为生成器函数yield类似于普通函数的return区别在于yield返回后Python会“记住”返回的位置在下次返回时就从这个位置处返回。yiled from关键字后面跟着也是一个生成器表示从该生成器返回。
在上述代码运行后for循环就是一个迭代的过程随着迭代每次fun1()生成器就会执行一次“yield”。因此上述函数会输出1——3——4——2。该端代码执行结果如下所示
在这里插入图片描述
上述代码其实并没有完全的实现协程或者说实现的协程非常牵强。

二、greenlet实现方式

greenlet是一个Python的第三方模块使用时需要提前安装。执行命令

pip install greenlet

即可完成安装。
greenlet实现协程代码如下所示

from greenlet import greenlet

def fun1():
    print(1)
    gr2.switch()
    print(2)
    gr2.switch()

def fun2():
    print(3)
    gr1.switch()
    print(4)

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

在上述代码中greenlet()函数生成了一个greenlet对象在该对象中调用switch()函数即可切换到指定greenlet对象对应的函数中执行因此可以实现协程操作。
上述代码执行结果如下所示
在这里插入图片描述

三、asyncio实现方式

在Python3.4以后asyncio是Python的一个内置模块因此无需安装即可调用。使用asyncio模式实现的Python代码如下所示

import asyncio

@asyncio.coroutine
def fun1():
    print(1)
    yield from asyncio.sleep(2)
    print(2)

@asyncio.coroutine
def fun2():
    print(3)
    yield from asyncio.sleep(2)
    print(4)

tasks=[
    asyncio.ensure_future(fun1()),
    asyncio.ensure_future(fun2())
]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

在上述代码中@asyncio.coroutin为一个装饰器使用该装饰器后一个函数由普通函数成为了协程函数。与之前两种方式相比这段代码实现了协程遇到I/O阻塞时自动的切换。

四、async和await关键字实现方式

使用async和await关键字的实现方式是Python3.5版本以后引入的协程操作方式这种方式与第三种本质上是相同的但是由于这两个关键字的引入因此协程的实现比起第三种更加简介。这种实现方式Python代码如下所示

import asyncio

async def fun1():
    print(1)
    await asyncio.sleep(2)
    print(2)

async def fun2():
    print(3)
    await asyncio.sleep(2)
    print(4)

tasks=[
    asyncio.ensure_future(fun1()),
    asyncio.ensure_future(fun2())
]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

这种协程的实现方式是Python官方推荐的实现方式如果Python版本允许尽量采取这种方式运行。上述代码执行结果如下所示
在这里插入图片描述
原创不易转载请说明出处https://blog.csdn.net/weixin_40228200

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python