沐风2021-协程介绍

[复制链接]
作者: ecithy | 时间: 2021-5-30 23:48:39 | python基础|
0 196
发表于 2021-5-30 23:48:39| 显示全部楼层 |阅读模式

暂时以了解为主。

计算机中提供了:线程、进程 用于实现并发编程(真实存在)。

协程(Coroutine),是程序员通过代码搞出来的一个东西(非真实存在)。

因为协程的性能虽然客观,但是语法复杂。 而且目前主流的库是使用多进程+多线程的方案。 虽如此,笔者只会推迟更新这款的深入内容,而不是拉下!

在Python中有多种方式可以实现协程,例如:

greenlet

pip install greenlet

from greenlet import greenlet


def mf():
    print(1)  # 第1步:输出 1
    gr2.switch()  # 第3步:切换到 mf2 函数
    print(2)  # 第6步:输出 2
    gr2.switch()  # 第7步:切换到 mf2 函数,从上一次执行的位置继续向后执行


def mf2():
    print(3)  # 第4步:输出 3
    gr1.switch()  # 第5步:切换到 mf 函数,从上一次执行的位置继续向后执行
    print(4)  # 第8步:输出 4


gr1 = greenlet(mf)  #启动一个协程
gr2 = greenlet(mf2)

gr1.switch()  # 第1步:去执行 mf 函数

输出

1
3
4
2

yield

def mf1():
    yield 1
    yield from mf2()
    yield 2


def mf2():
    yield 3
    yield 4


f1 = mf1()
for i in f1:
    print(i)

输出

1
3
4
2

虽然上述两种都实现了协程,但这种编写代码的方式没啥意义。 这种来回切换执行,可能反倒让程序的执行速度更慢了(相比较于串行)。

协程

不要让用户手动去切换,而是遇到IO操作时能自动切换。

Python在3.4之后推出了asyncio模块,Python3.5推出async语法 ,内部基于协程并且遇到IO请求自动化切换。

import asyncio


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


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


tasks = [asyncio.ensure_future(mf1()), asyncio.ensure_future(mf2())]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

输出

1
3
2
4
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

!jz_fbzt! 快速回复 !jz_sctz! !jz_fhlb! 按钮
快速回复 返回列表 返回顶部