我正在使用Python 2.7中的multiprocessing
模块来实现一个基本程序,该程序产生两个进程,一个消费者进程和一个生产者进程。生产者进程每50毫秒生成一次数据,并通过multiprocessing.Pipe
将其发送给消费者进程。 1s之后,生产者进程停止生成数据并关闭管道的send_end
。
下面的代码清单显示了我尝试实现所需行为的代码:
import multiprocessing as mp
import time
class testClass(object):
def __init__(self,name):
self.name=name
def doSomething(self):
print("Object %s reporting!"%(self.name))
#function receives objects
def receiverFunction(receive_end):
while True:
#receive object from the pipe
try:
obj=receive_end.recv()
except EOFError as err:
print("nothing left in the pipe, aborting receiver thread")
break
#use the received object
obj.doSomething()
#function generates objects
def producerFunction(send_end):
start=time.time()
i=0
#produce data every 50ms for 5s
while time.time()-start<1:
i+=1
send_end.send(testClass("Object%d"%(i)))
time.sleep(50e-3)
print("Closing the send_end in producer process...")
send_end.close()
if __name__=="__main__":
(receive_end,send_end)=mp.Pipe()
p_recv=mp.Process(target=receiverFunction,args=[receive_end])
p_send=mp.Process(target=producerFunction,args=[send_end])
p_recv.start()
p_send.start()
p_send.join()
send_end.close()
print("Closing send_end in parent process")
p_recv.join()
使用者队列从不接收EOFERROR
,并且永远等待从receive_end
接收某些数据,即使队列的send_end
在父进程和生产者进程中均已关闭。
程序输出如下:
Object Object1 reporting!
Object Object2 reporting!
Object Object3 reporting!
Object Object4 reporting!
Object Object5 reporting!
Object Object6 reporting!
Object Object7 reporting!
Object Object8 reporting!
Object Object9 reporting!
Object Object10 reporting!
Object Object11 reporting!
Object Object12 reporting!
Object Object13 reporting!
Object Object14 reporting!
Object Object15 reporting!
Object Object16 reporting!
Object Object17 reporting!
Object Object18 reporting!
Object Object19 reporting!
Object Object20 reporting!
Closing the send_end in producer process...
Closing send_end in parent process