大飞

大飞 关注TA

挑战一切!

大飞

大飞

关注TA

挑战一切!

  • 加入社区3,268天
  • 写了333,609字

该文章投稿至Nemo社区   Python  板块 复制链接


Python 协程——比子线程还厉害100倍的东东

发布于 2018/09/19 11:25 2,111浏览 0回复 1,375


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

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

 在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值。

 但是Python的yield不但可以返回一个值,它还可以接收调用者发出的参数。

 来看例子:

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

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


# 生产者
def producer(c):
    # 发送消息启动生成器
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print('生产者生产出数据:%s' % n)
        # 生产出来的n 发送给消费者进行消费
        r = c.send(n)
        print('消费者返回数据:%s' % r)
        print('生产者说:口气不小,我继续生产,撑死你')
    # 生产完成 关闭生成器 就是消费者
    c.close()


# 消费者
def consumer():
    r = ''
    while True:
        # 获取生产者传入参数 同时可以将r返回给生产者 yield可取参又可传参
        n = yield r
        if not n:
            return
        print('消费者消费数据:%s' % n)
        r = '消费数据(%s)完成,你可以继续生成,你生产多少我就吃多少' % n


c = consumer()
producer(c)

执行结果如下:

生产者生产出数据:1

消费者消费数据:1

消费者返回数据:消费数据(1)完成,你可以继续生成,你生产多少我就吃多少

生产者说:口气不小,我继续生产,撑死你

生产者生产出数据:2

消费者消费数据:2

消费者返回数据:消费数据(2)完成,你可以继续生成,你生产多少我就吃多少

生产者说:口气不小,我继续生产,撑死你

生产者生产出数据:3

消费者消费数据:3

消费者返回数据:消费数据(3)完成,你可以继续生成,你生产多少我就吃多少

生产者说:口气不小,我继续生产,撑死你

生产者生产出数据:4

消费者消费数据:4

消费者返回数据:消费数据(4)完成,你可以继续生成,你生产多少我就吃多少

生产者说:口气不小,我继续生产,撑死你

生产者生产出数据:5

消费者消费数据:5

消费者返回数据:消费数据(5)完成,你可以继续生成,你生产多少我就吃多少

生产者说:口气不小,我继续生产,撑死你

Process finished with exit code 0


本文标签
 {{tag}}
点了个评