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

    生产者消费者模型是接着上一篇:进程来写的,前面的都是基础,

    生产者消费者模型是对前面知道的应用:

    先看代码:

    #!/usr/bin/env python
    #coding:utf-8
    #Created by Andy @ 2017/9/20
    
    
    import time, os, random
    from multiprocessing import JoinableQueue,Process
    
    def produce_bread(q):
        for i in range(1,5):
            time.sleep(2)
            res = "第%s个bread" % i
            q.put(res)
            print("%s制造了%s面包" % (os.getpid(), res))
        q.join()
    
    
    def produce_noodle(q):
        for i in range(1,3):
            time.sleep(3)
            res = "第%s碗noodle" % i
            q.put(res)
            print("%s制造了%s面条" %(os.getpid(), res))
        q.join()
    
    def produce_rice(q):
        for i in range(1,6):
            time.sleep(4)
            res = "第%s 碗米饭" % i
            q.put(res)
            print("%s制造了%s" %(os.getpid(), res))
        q.join()
    
    def consumer(q):
        while True:
            res = q.get()
            time.sleep(random.randint(2,5))
            print( "33[44m%s吃了%s33[0m"%(os.getpid(),res))
            q.task_done()
    
    
    if __name__ == "__main__":
        q = JoinableQueue()
    
        p1 = Process(target=produce_rice, args=(q,))
        p2 = Process(target=produce_bread, args=(q,))
        p3 = Process(target=produce_noodle, args=(q,))
    
        c1 = Process(target=consumer, args=(q,))
        c2 = Process(target=consumer, args=(q,))
        c1.daemon = True
        c2.daemon = True
    
        p1.start()
        p2.start()
        p3.start()
    
        c1.start()
        c2.start()
    
        p1.join()
        p2.join()
        p3.join()
    
        print("Finish!")
    

    当主进程启动后,随即生产者进程启动,假设现在生产了一个食品,

    也就是Queue中有一个元素,生产者在生产完这一个食品之后 由于

    q.join 进入了等待Queue取空才会结束当前进程。

    那现在假设一个消费者进程来吃掉了这个食品,此时队列q为空,消费者

    在取掉这个食品之后 经过q.task_done()给生产者发送信号,街道者知道

    队列q为空了,此时生产者进程可以结束了,主进程看到生产者进程结束

    也可以结束了,但是此时:消费者进程仍然卡在那里,因为它在等待队列q,

    不停的从队列中get数据q.get(),所以如果直接结束,那么消费者进程就成了僵尸进程了

    那么,要怎么才能让主进程结束时让消费者进程也结束呢?

    显然这里可以用守护的方法

    就是前面的设置:

    c1.daemon = True
    

     来看下运行结果:

    可以看到:生产者只管生产,并不管有没有人来吃,

    但是生产完了它还得等待有消费者来消费完。

  • 相关阅读:
    influxdb时序数据库之随想其他列式存储数据库
    ss 命令参数 redis-benchmark 以及POSTMAN, CURL分析网络
    HTTP2.0
    我的2020工作总结
    2021-03-31 JDK8 字符串常量池
    try catch与spring的事务回滚
    Spring主动触发事务回滚
    Redis五种数据类型及应用场景
    java面试题
    ubuntu linux mysql 安装 基本操作 命令
  • 原文地址:https://www.cnblogs.com/Andy963/p/7582020.html
Copyright © 2011-2022 走看看