个人博客

python协程

协程,又称为微线程,纤程。协程的作用:在执行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协作完成任务,而非线程的抢占式多任务。

相关标签
回到顶部