使用Python的多处理模块生成类属性

时间:2014-08-28 02:52:53

标签: python multiprocessing

我是多处理模块的新手,并且想知道一个类是否可以生成它可以与之通信的工作类。我有一个实例,其中一个对象接收数据,并且需要根据该数据快速构造属性,这些数据本身就是对象。以下代码是一个简单的案例:

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类使用该输出为其自身分配属性。

2 个答案:

答案 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)

这可行,但它不是一个干净的解决方案。你可以修改它,并试验它以获得你想要的结果,我推荐使用一个标记值。