python协程
作者:向前的步伐 / 发表: 2019年7月1日 23:00 / 更新: 2019年7月1日 23:10 / python / 阅读量:654
协程,又称为微线程,纤程。协程的作用:在执行A函数的时候,可以随时中断,然后去执行B函数,再接着中断继续执行A函数。整个过程并不是函数调用,过程很像多线程,然而只有一个线程在执行。
协程可以完美的处理IO密集型问题,但是不适合CPU密集型,CPU密集型需要多进程+多线程来充分利用CPU。
协程的优势:执行的效率高,它不是线程,没有线程切换的消耗,都是单线程中自主切换,所以性能比线程更高。协程还不需要多线程的锁机制,因为只有一个线程,也不存在写冲突,所以在协程中共享资源不需要加锁,只需要判断状态就好。
我们可以来看一个生产者-消费者模型,来看下协程的代码实现:
import time
def consumer():
ret = ''
while True:
num = yield ret
if not num:
return
print('Consuming %s...' % num)
time.sleep(1)
ret = '200 OK'
def produce(c):
c.next()
num = 0
while num < 5:
num = num + 1
print('Producing %s...' % num)
ret = c.send(num)
print('Consumer return: %s' % ret)
c.close()
if __name__=='__main__':
c = consumer()
produce(c)
可以了解到,整个consumer函数就是一个生成器,而produce函数就是一个封装的生成器对象做参数的一个函数,整体的执行流程如下:
1,首先是先调用生成器的next()启动生成器,consumer执行到yield返回;
2,然后调用生成器的send()函数,将参数n传递回consumer生成器;
3,consumer获取到值之后,继续执行,直到下一个yield返回到produce;
4,produce再拿到consumer返回的结果之后继续执行;
5,当produce所有的生产操作都完成之后,关闭consumer生成器,协程结束。
整个流程无锁,由一个线程执行,produce和consumer协作完成任务,而非线程的抢占式多任务。