队列:进程间通信(IPC(inter-process communication),管道+锁
1. q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。blocked为True(默认值)
如果超时,会抛出Queue.Full异常。
如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
2. q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值)
如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值
否则, 如果队列为空,则立即抛出Queue.Empty异常.
3. q.get_nowait():同q.get(False)
4. q.put_nowait():同q.put(False)
5.q.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。
6. q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止
from multiprocessing import Queue q=Queue(3) q.put("first") q.put("second") q.put("third") ''' q.put("fourth") #程序一直卡着,直到first取走 q.put("fourth",block=False) #队列满之后,抛出Full异常 q.put_nowait("fourth") #队列满之后,抛出Full异常 q.put("fourth",timeout=2)#队列满之后,2秒后抛出Full异常 ''' print(q.get()) print(q.get()) print(q.get()) ''' first second third '''
#生产者消费者模型,JoinableQueue ''' 生产者在等 消费者-[q.task_done]->(队列)->[q.join]->生产者结束-[p.join]->主进程结束-[c.daemon]->消费者结束 q.task_done():消费者使用此方法发出信号,表示q.get()的返回项目已经被处理。 q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止 ''' from multiprocessing import Process,JoinableQueue import time,os def produce(q,food): for i in range(3): time.sleep(1) res="%s %s"%(food,i) q.put(res) print("%s 生产了 %s" %(os.getpid(),res)) q.join()#生产者等待队列 def consume(q): while True: res=q.get() if res is None:break time.sleep(2) print("%s 吃了 %s" %(os.getpid(),res)) q.task_done()#向q.join()发送一次信号,证明一个数据已经被取走了 if __name__=="__main__": q=JoinableQueue() #生产者们 p1=Process(target=produce,args=(q,"包子")) p2=Process(target=produce,args=(q,"饺子")) p3=Process(target=produce,args=(q,"花卷")) #消费者们 c1=Process(target=consume,args=(q,)) c2=Process(target=consume,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("主进程")
'''
14565 生产了 包子 0 14566 生产了 饺子 0 14568 生产了 花卷 0 14565 生产了 包子 1 14566 生产了 饺子 1 14568 生产了 花卷 1 14570 吃了 包子 0 14565 生产了 包子 2 14572 吃了 饺子 0 14566 生产了 饺子 2 14568 生产了 花卷 2 14570 吃了 花卷 0 14572 吃了 包子 1 14570 吃了 饺子 1 14572 吃了 花卷 1 14570 吃了 包子 2 14572 吃了 饺子 2 14570 吃了 花卷 2 主进程
'''