我是多处理模块的新手,并且想知道一个类是否可以生成它可以与之通信的工作类。我有一个实例,其中一个对象接收数据,并且需要根据该数据快速构造属性,这些数据本身就是对象。以下代码是一个简单的案例:
class Worker(multiprocessing.Process):
def __init__(self, in_queue, out_queue):
multiprocessing.Process.__init__(self)
self.in_queue = in_queue
self.out_queue = out_queue
def run(self):
#Loop through the in_queue until a None is found
for tup in iter(self.in_queue.get,None):
#Try to manipulate the data
try:
self.out_queue.put(tup[0]*tup[1])
except:
self.out_queue.put('Error')
self.in_queue.task_done()
#Remove the None from the in_queue
self.in_queue.task_done()
class Master():
def __init__(self,data):
#Initialize some data to be operated on
self.data=data
def gen_attributes(self):
#Initialize Queues to interact with the workers
in_queue=multiprocessing.JoinableQueue()
out_queue=multiprocessing.Queue()
#Create workers to operate on the data
for i in range(4):
Worker(in_queue,out_queue).start()
#Add data to the input queue
for tup in self.data:
in_queue.put(tup)
#Stop Condition for each worker
for _ in range(4):
in_queue.put(None)
in_queue.close()
#Wait for processes to finish
in_queue.join()
#Store the output as new attributes of the class
self.attributes=[]
for _ in range(0,out_queue.qsize()):
self.attributes.append(out_queue.get())
#Create and instance of the Master class, and have it generate it's own attributes using the multiprocessing module
data=[(1,2),(2,2),(3,4)]
M=Master(data)
M.gen_attributes()
print M.attributes
实质上,使用给定数据生成Master类的实例。然后,主类将该数据传递给多个工作人员以进行操作并放置在输出队列中。然后,Master类使用该输出为其自身分配属性。
答案 0 :(得分:1)
想出来。在if __name__ == '__main__'
下包含Master类的实例化可以解决问题。显然这是一个Windows问题。更多信息:
https://docs.python.org/2/library/multiprocessing.html#multiprocessing-programming
答案 1 :(得分:0)
这看起来像multiprocessing.Pool的完美用例。您可能会注意到您的程序挂起,Master
没有收到您期望的任何属性。那是因为它当时没有收到任何信息,因为它需要在out_queue
上阻止才能从队列中读取信息,因为在你的程序从out_queue
读取时它是空的。
一个简单的解决方法是在队列的get
方法上阻塞并等待超时,如下所示:
while True:
attr = out_queue.get(True, 0.1)
if not attr:
break
self.attributes.append(attr)
这可行,但它不是一个干净的解决方案。你可以修改它,并试验它以获得你想要的结果,我推荐使用一个标记值。