python multiprocessing queue_Python:multiprocessing.Queue()中可能的数据丢失

importmultiprocessingfrommultiprocessingimportProcess,Event,Queueimporttimedefreader(data):input_queue=data[0]e=data[1]output_queue=data[2]whileTrue:ifnote.is_set():# if there is a signal to start#if not output_queue.empty(): # hangs somewhymsg=input_queue.get()# Read from the queueoutput_queue.put(msg)# copy to output_queue#print("1")if(msg=='DONE'):# signal to stope.set()# signal that there is no more dataprint("done")defreader1(data):input_queue=data[0]e=data[1]output_queue=data[2]whileTrue:ifnote.is_set():# if there is a signal to startmsg=input_queue.get()# Read from the queueoutput_queue.put(msg)# copy to output_queue#print("2")if(msg=='DONE'):# signal to stope.set()# signal that there is no more dataprint("done")defreader2(data):input_queue=data[0]e=data[1]output_queue=data[2]whileTrue:ifnote.is_set():# if there is a signal to startmsg=input_queue.get()# Read from the queueoutput_queue.put(msg)# copy to output_queue#print("3")if(msg=='DONE'):# signal to stope.set()# signal that there is no more dataprint("done")defwriter(count,queue):## Write to the queueforiiinrange(0,count):queue.put(ii)# Write 'count' numbers into the queuequeue.put('DONE')if__name__=='__main__':# I do not use manager, as it makes everything extremely slow#m = multiprocessing.Manager()#input_queue = m.Queue()input_queue=Queue()# reader() reads from queue# writer() writes to queueoutput_queue=Queue()e=Event()e.set()reader_p=Process(target=reader,args=((input_queue,e,output_queue),))reader_p.daemon=Truereader_p.start()# Launch reader() as a separate python processreader_p1=Process(target=reader1,args=((input_queue,e,output_queue),))reader_p1.daemon=Truereader_p1.start()reader_p2=Process(target=reader2,args=((input_queue,e,output_queue),))reader_p2.daemon=Truereader_p2.start()forcountin[10**4,10**5,10**6]:_start=time.time()writer(count,input_queue)# Send a lot of stuff to readerse.clear()# unset event, giving signal to a workere.wait()# waiting for reader to finish# fetch results from output_queue:results=[]whilenotoutput_queue.empty():results+=[output_queue.get()]print(len(results))# check how many results we haveprint("Sending %s numbers to Queue() took %s seconds"%(count,(time.time()-_start)))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值