进程队列

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('\033[44m%s 生产了 %s\033[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('\033[45m%s 吃 %s\033[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('\033[45m%s 吃 %s\033[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('\033[44m%s 生产了 %s\033[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()方法为止

 

posted @ 2018-11-19 22:01  986428528  阅读(116)  评论(0)    收藏  举报