让我们先引用一段我百度的协程的介绍
协程,又称微线程,纤程。英文名Coroutine。
协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。
子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。
所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。
子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。
协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
下面应该是我们开发中遇到多任务后考虑到的
多任务---->异步---->多进程 or 多线程
说到异步,我们首先想到多线程和多进程.
具体的介绍参照 https://blog.youkuaiyun.com/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 来更直观表现这种协程