zoukankan      html  css  js  c++  java
  • python课堂整理20----生产者消费者模型

    一、实现功能:店铺生产包子,消费者来吃

    import time
    def producter():
        ret = []
        for i in range(10):
            time.sleep(0.1)
            ret.append('包子%s'%i)
        return ret
    
    def consumer(res):
        for index, baozi in enumerate(res):
            time.sleep(0.1)
            print('第%s个人吃了%s'%(index, baozi))
    
    a = producter()
    consumer(a)
    

    弊端:生产包子和吃包子是两个独立的过程,只有生产者把包子做完,消费者才能开始吃

    思考:怎么实现两个程序的并发过程

    ######################################

    从生成器入手,因为生成器函数能保留函数的运行状态

    def test():
        print('开始啦')
        yield 0
        print('第一次')
        yield 1
        print('第二次')
        yield 2
    
    t = test() #只是生成一个生成器函数,并没有执行
    print(t)
    res = t.__next__()
    print(res)
    

     

    ♦  send()

    ①send函数必须传入一个参数,也能触发一次生成器

    ②send将传入的参数传递给yield,此时再把yield赋给一个变量,即保留该参数

    def test():
        print('开始啦')
        first = yield 0   #接受send传过来的值,赋值给first
        print('第一次',first)
        yield 1
        print('第二次')
        yield 2
    
    t = test() #只是生成一个生成器函数,并没有执行
    res = t.__next__()
    print(res)
    a = t.send('我喜欢你')
    print(a)
    

    ♦用上述知识实现生产者消费者并发过程

    import time
    def consumer(name):
        print('我是%s,我准备吃包子了' %name)
        while True:
            baozi = yield
            time.sleep(0.1)
            print('%s开心地把%s吃掉了' %(name, baozi))
    
    
    def producter():
        c1 = consumer('dabai')
        c1.__next__()
        for i in range(10):
            time.sleep(0.1)
            c1.send('包子%s' %i)
        return '吃完了,真开心'
    a = producter()
    print(a)
    

    多人并发过程

    import time
    def consumer(name):
        print('我是%s,我准备吃包子了' %name)
        while True:
            baozi = yield
            time.sleep(0.1)
            print('%s开心地把%s吃掉了' %(name, baozi))
    
    
    def producter():
        c1 = consumer('dabai')
        c2 = consumer('jinling')
        c1.__next__()
        c2.__next__()
        for i in range(10):
            time.sleep(0.1)
            c1.send('包子%s' %i)
            c2.send('包子%s' %i)
        return '吃完了,真开心'
    a = producter()
    print(a)
    

    一个奋斗中的产品小白
  • 相关阅读:
    Python使用Django创建第一个项目
    如何使用RobotFramework编写好的测试用例
    接口测试 总结(什么是接口测试)
    APP接口测试
    Django基础五之中间件
    Django基础五之django模型层(二)多表操作
    Django基础五之django模型层(一)单表操作
    Django基础四之模板系统
    Django基础三之视图函数
    DJANGO2--url路由
  • 原文地址:https://www.cnblogs.com/dabai123/p/11209874.html
Copyright © 2011-2022 走看看