• 进程队列


    from multiprocessing import Process,Queue
    import time
    import random,os
    
    def producer(name,q):
        for i in range(10):
            time.sleep(random.randint(1,3))
            res='%s%s'%(name,i)
            q.put(res)
            print('33[44m%s 生产了 %s33[0m' %(os.getpid(),res))
        # q.put(None)
    
    def consumer(q):
        while True:
            res=q.get()
            if res is None:break
            time.sleep(random.randint(1,3))
            print('33[45m%s 吃 %s33[0m' %(os.getpid(),res))
    
    
    if __name__=='__main__':
        q=Queue()         #创建一个队列,实际最为一个交互的地方,或者数据缓冲区
        p1=Process(target=producer,args=('baozi',q,))
        p2=Process(target=producer,args=('gutou',q))  #开启2个进程
        c1=Process(target=consumer,args=(q,))
        c2=Process(target=consumer,args=(q,))   #开启2个进程
        p1.start()
        p2.start()
        c1.start()
        c2.start()
        p1.join()
        p2.join()  #等子进程结束,主进程才能结束
        q.put(None)  #表示结束
        q.put(None)# 几个c put几个,让每个c都知道
        print("zhu")
    from multiprocessing import Process,JoinableQueue
    import time,random,os
    def consumer(q):
        while True:
            res=q.get()
            time.sleep(random.randint(1,3))
            print('33[45m%s 吃 %s33[0m' % (os.getpid(), res))
            q.task_done()  #发送处理完成信号给q.join()
    def producer(name,q):
        for i in range(10):
            time.sleep(random.randint(1,3))
            res='%s%s'%(name,i)
            q.put(res)
            print('33[44m%s 生产了 %s33[0m' % (os.getpid(), res))
        q.join() #阻塞,直到所有的item都返回q.task_done()信号
    
    
    if __name__=='__main__':
        q=JoinableQueue()
        p1=Process(target=producer,args=('baozi',q))
        p2=Process(target=producer,args=('gutou',q))
        c1=Process(target=consumer,args=(q,))
        c2=Process(target=consumer,args=(q,))
        c1.daemon=True  
        c2.daemon=True   #主进程退出时,c也退出
        p1.start()
        p2.start()
        c1.start()
        c2.start()
        p1.join() #等子进程执行完,住进程再退出
        p2.join()
        print("zhu")

    #JoinableQueue([maxsize]):这就像是一个Queue对象,但队列允许项目的使用者通知生成者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的。
    
       #参数介绍:
        maxsize是队列中允许最大项数,省略则无大小限制。    
      #方法介绍:
        JoinableQueue的实例p除了与Queue对象相同的方法之外还具有:
        q.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常
        q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止
  • 相关阅读:
    poj-3580-SuperMemo-splay
    JS 添加到事件的多个对象
    1.9 效率高,安排约会
    我展示了视频采集前端vfe和camera,decode等交互驱动的体系结构
    2013年7月27日杂记
    深入JS系列学习4
    深入JS系列学习3
    深入JS系列学习2
    高质量JavaScript代码书写基本要点学习
    给硬件复兴把脉 硬件创新最有机会的十个方向
  • 原文地址:https://www.cnblogs.com/wuxi9864/p/9986077.html
Copyright © 2020-2023  润新知