from multiprocessing import Queue q=Queue(3) q.put(1) q.put(2) q.put(3) # q.get() #加上这句话就不会阻塞, # q.put(4) #由于默认为阻塞状态,程序将会阻塞在这里 #参数block:默认为真,表示队列已满,程序阻塞,表示是否阻塞 #如果为False表示不需要阻塞,如果队列已满,将会抛出异常 #参数timeout():表示阻塞时间单位为秒 try: # q.put(4,block=False) q.put(4,block=True,timeout=1) except: print("现有消息队列已满,现有队列长度为%s"%(q.qsize() )) print("~~~~~~~~``") #put的另一种方式 #q.put_nowait(5),等价于q.put(5,block=False) try: q.put_nowait(5) except: print("现有消息队列已满,现有队列长度为%s"%(q.qsize())) #推荐方式,先判断消息队列是否满了,再往里放 if not q.full(): print("6") #取 #格式 q.get() q.get() q.get() print("现有队列长度为%s" % (q.qsize())) # q.get() # q.get(block=False) # q.get(block=True,timeout=2) #在读取时判断是否为空 if not q.empty(): q.get() #另一种写法 q.get_nowait() #等价于q.get(block=False) print("~~~~~~~")
队列阻塞的案例
#需求,在父进程中创建两个子进程,一个往Queue里写数据,一个读取数据 from multiprocessing import Queue from multiprocessing import Process import random,time def write(q): #队列中的Exit看成结束标志,不是数据,当value为Exit时,在read()中跳出循环 for value in ["A","B","C","D","Exit"]: q.put(value) #把value值加入队列中 print("Put %s"%(value)) time.sleep(random.randint(0,2)) def read(q): while True: #不断的在这里等待取数据 if not q.empty(): #如果队列不为空就执行 value=q.get() if value=="Exit": #得到标志就退出 break else: print("Get %s from queue" % (value)) time.sleep(random.randint(0, 2)) if __name__ == '__main__': #创建一个队列 q=Queue() #创建进程 pw=Process(target=write,args=(q,)) pr=Process(target=read,args=(q,)) #启动进程 pw.start() #写入 pw.join() #此时pw结束,阻塞在这里等到pw执行完成之后在往下执行 pr.start() #读出开启 pr.join() print("程序pw进程结束")