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

    生产者消费者模型

    from multiprocessing import Process,Queue,JoinableQueue
    import time
    import random
    
    # def producer(name,product):
    
    # 上述写法错误,在开子进程时,不传入q,
    
    # 则子进程的名称空间中就没有队列对象q,无法对队列进行操作
    
    def producer(name,product,q):
        for i in range(1,6):
            data = "%-10s正在生产【%s%s】" % (name,product,i)
            print(data)
            # 模拟生产延迟
            time.sleep(random.randint(1,3))
            # 放入队列
            food = "%s%s"%(product,i)
            q.put(food)
    
    def consumer(name,q):
        while True:
            # 从队列中取出food,若无则等待  q.get_nowait()不等待,直接报错
            food = q.get()
            time.sleep(random.randint(1,3))
            print("%-15s吃了【%s】" %(name,food))
            #  在完成一项工作之后,q.task_done()函数向任务已经完成的队列发送一个信号
            # 队列计数减一,当计数为零时,执行q.join()。q.join() 实际上意味着等到队列为空,再执行别的操作
            q.task_done()
    
    
    
    if __name__ == '__main__':
        q = JoinableQueue()
        # q = Queue()
        p1 = Process(target = producer,args=("Jil","手打鱼丸",q))
        p2 = Process(target = producer,args=("Fishball","姜糖鱼丸",q))
        c1 = Process(target = consumer,args=("small piggy1",q))
        c2 = Process(target = consumer,args=("small piggy2",q))
    
        # 必须start开始进程
        p1.start()
        p2.start()
        
        # 在消费者进行开始前,将其设置成守护进程,与主程序共存亡
        c1.daemon = True
        c2.daemon = True
        c1.start()
        c2.start()
        
        # 当p1 p2子进程运行完成时,主程序继续运行
        p1.join()
        p2.join()
        # 当队列计数为零时,即队列为空时,主程序继续运行
        q.join()
        print("【猪猪】把【鱼丸】吃完啦!")
    
    
    
  • 相关阅读:
    RecyclerView+CardView简单使用
    Android六大进程间通信方式总结之一:基本知识
    前台服务
    Notification
    SQLite的基本用法
    SharePreferences基本用法
    自定义控件和使用的两种基本方法
    AsyncTask的简单使用
    Java Servlet调用数据库复习
    JDBC数据源(DataSource)的简单实现
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12764791.html
Copyright © 2011-2022 走看看