zoukankan      html  css  js  c++  java
  • 生产者与消费者模型初探

    1.引例

    def producer():
        r = []
        for i in range(50):
            r.append('包子%s' % i)
        return r
    product= producer()
    
    def comsummer(product):
        for index, baozi in enumerate(product):
            print('第%s个人,吃了%s' % (index, baozi))
        return 0
    eat = comsummer(product)

    上述代码有一个弊端就是,必须得等到生产者把所有的‘包子’都生产完,再交给消费者‘吃包子’。这样浪费了内存,消费者只能等待生产者。

    2.send()函数的功能

    send()函数有着与__next__()方法一样的功能,使生成器运行到第一个yield为止。send()的另一个功能是,能将括号内的值,传送到生成器运行中断的那个yield。也就是send()函数生成器运行到某一个yield中断,然后可以将值传给这个yield。

    #.send()功能演示
    
    def pro():
        print('2018-19赛季最佳第一阵容')
        print('前锋NO.1')
        xiao_shuai = yield 'lebron james'
        print('前锋NO.2')
        print(xiao_shuai)
        yield 'pual george'
    
    pl = pro()
    print(pl.__next__())
    re = pl.send('kevin durant')
    print(re)
    
    #运行结果:
    2018-19赛季最佳第一阵容
    前锋NO.1
    lebron james
    前锋NO.2
    kevin durant
    pual george

    3.生产者与消费者模型

    当程序中出现明显的两类任务,一类任务是负责生产,另外一类任务是负责处理生产的数据的(如爬虫),我们就可以利用该模型来处理。

    import time
    
    def consumer(name):
        print('我是%s,我要开始吃包子了' %name)
        while True:
            baozi = yield
            print('%s很开心地把%s吃掉了' %(name, baozi))
    
    def producer():
        c1 = consumer('lebron')
        c2 = consumer('durant')
        c1.__next__()
        c2.__next__()
        for i in range(5):
            c1.send('第%s个包子' %i)
            c2.send('第%s个饺子' %i)
    
    eat = producer()
    
    #运行结果:
    我是lebron,我要开始吃包子了
    我是durant,我要开始吃包子了
    lebron很开心地把第0个包子吃掉了
    durant很开心地把第0个饺子吃掉了
    lebron很开心地把第1个包子吃掉了
    durant很开心地把第1个饺子吃掉了
    lebron很开心地把第2个包子吃掉了
    durant很开心地把第2个饺子吃掉了
    lebron很开心地把第3个包子吃掉了
    durant很开心地把第3个饺子吃掉了
    lebron很开心地把第4个包子吃掉了
    durant很开心地把第4个饺子吃掉了
    def action(name1, name2):
        print('%s 和 %s 开始1v1斗牛啦!' %(name1, name2))
        time.sleep(1)
        while True:
            action1 = yield
            print('%s直接一个加速过掉%s,然后%s' %(name1, name2, action1))
            time.sleep(1)
            action2 = yield
            print('%s背身单打%s,%s' %(name1, name2, action2))
            yield '1v1结束'
    
    def move():
        name1 = input('>>>')
        name2 = input('>>>')
        vs = action(name1, name2)
        vs.__next__()
        vs.send('一记战斧劈扣')
        end = vs.send('翻身跳投将球投进')
        print(end)
    
    p = move()
  • 相关阅读:
    kafka与Rocketmq的区别【转】
    k8s故障解决干货文档链接
    利用local nginx搭建k8s-1.17.4高可用kubernetes集群
    生产gitlab还原步骤
    jenkins备份和还原
    ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源
    使用Feign出现404错误问题
    高并发系统限流-漏桶算法和令牌桶算法
    框架-springmvc源码分析(二)
    框架-springmvc源码分析(一)
  • 原文地址:https://www.cnblogs.com/cjsword/p/10442879.html
Copyright © 2011-2022 走看看