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()方法为止