Python语言中的协程(生产者-消费者举例)

来源:互联网 发布:华为mate10抢购软件 编辑:程序博客网 时间:2024/06/01 09:24

协程又被称为微线程,它的特点是不需要进行线程的切换,因为整个程序的执行过程中,只有一个线程.没有线程切换的开销,和多线程相比较,线程数量越多,协程的性能就越高.它子程序的执行是由程序自身控制.又由于只存在一个线程,所以不存在什么变量共享等冲突问题,也不存在锁机制,更不会出现死锁的情况.这样一来,执行效率就比多线程高的多.为了有效利用多核CPU,我们可以用进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
看例子:

传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。

如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高:

# 注意 变成generator的函数,在首次调用的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行def consumer():    r = ''    print('lalalalalaal') # 只有第一次会执行(启动生成器), 之后再调用生成器就会从yield处执行    while True:        n = yield r # 再次执行时从这里的yield继续执行, 将把produce传入的参数 n 赋给局部变量 n . 下轮循环再次遇到yield就会就将 r 返回给produce函数        # 所以Python的yield不但可以返回一个值,它还可以接收调用者发出的参数        print('xxxxxlalalalalaal')  # 由于生成器在启动的时候遇到上面的yield就返回了, 所以第一次不会执行这条语句. 之后每次都会被执行        if not n:            return        print('[CONSUMER] Consuming %s...' % n)        r = '200 OK'  # 因为yield r 所以这个r会在下一次循环被返回给produce函数         a = 'fake 200 OK' # 返回的值与a无关def produce(c):    c.send(None)    print('babababab')    n = 0    while n < 5:        n = n + 1        print('[PRODUCER] Producing %s...' % n)        r = c.send(n) # # 获取生成器consumer中由yield语句返回的下一个值        print('[PRODUCER] Consumer return: %s' % r)    c.close()c = consumer()      # 并不会启动生成器, 只是将c变为一个生成器print('AaAaAaAaAa') # AaAaAaAaAaproduce(c)# =># AaAaAaAaAa# lalalalalaal# babababab# [PRODUCER] Producing 1...# xxxxxlalalalalaal# [CONSUMER] Consuming 1...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 2...# xxxxxlalalalalaal# [CONSUMER] Consuming 2...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 3...# xxxxxlalalalalaal# [CONSUMER] Consuming 3...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 4...# xxxxxlalalalalaal# [CONSUMER] Consuming 4...# [PRODUCER] Consumer return: 200 OK# [PRODUCER] Producing 5...# xxxxxlalalalalaal# [CONSUMER] Consuming 5...# [PRODUCER] Consumer return: 200 OK

    生成器generator这里面的yield不但可以返回一个值,它还可以接收调用者发出的参数.首先等待生产者发出send()调用的参数,执行子程序,再通过yield返回参数到生产者,生产者继续生产,消费者子程序等待传来参数,以此循环往复,直到生产者停止生产...

0 0
原创粉丝点击