python里的异步与协程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ty5622022/article/details/84959536

 让我们先引用一段我百度的协程的介绍

协程,又称微线程,纤程。英文名Coroutine。

协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。

所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。

子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

下面应该是我们开发中遇到多任务后考虑到的

多任务---->异步---->多进程 or 多线程 

说到异步,我们首先想到多线程和多进程.

具体的介绍参照  https://blog.csdn.net/ssirreplaceable/article/details/53171706

多任务可以由多进程完成,也可以由一个进程内的多线程完成。

我在这里简单的说一下

多进程模式的缺点是创建进程的代价大

多线程在切换线程的时候,对系统开销比较大,且多个线程共享变量,需要配合锁机制去使用

Python对协程的支持是通过generator实现的 

生成器中有 send 和next 的方法

协程:协作完成一个程序

下面来看一个小例子,怎么用yield 来让两个函数协程执行的

def eat():
    food = ''
    while True:
        n = yield food  # food表示接收send的参数(即食物),每次遇到yield,相当于我要买一份
        if not n:
            return
        print('这是吃掉的第%s份食物' % n)
        food = '我吃完了,再来一份'


def buy(c):
    c.send(None) # 启动生成器
    n = 0
    while n < 5:
        n = n + 1
        print('买的第%s份食物' % n)
        r = c.send(n)
        print('吃货给我传的信息: %s' % r)
    c.close()


c = eat()
buy(c)
/usr/local/bin/python3.7 /Users/taov5/www/typhon/test.py
买的第1份食物
这是吃掉的第1份食物
吃货给我传的信息: 我吃完了,再来一份
买的第2份食物
这是吃掉的第2份食物
吃货给我传的信息: 我吃完了,再来一份
买的第3份食物
这是吃掉的第3份食物
吃货给我传的信息: 我吃完了,再来一份
买的第4份食物
这是吃掉的第4份食物
吃货给我传的信息: 我吃完了,再来一份
买的第5份食物
这是吃掉的第5份食物
吃货给我传的信息: 我吃完了,再来一份

在python3中  我们可以用async/await 来更直观表现这种协程

猜你喜欢

转载自blog.csdn.net/ty5622022/article/details/84959536
今日推荐