在Python多处理中使用绑定方法

时间:2018-02-27 19:20:23

标签: python python-multiprocessing

假设我有一个名为my_object的对象。我想创建3个不同的my_object实例并运行绑定方法my_object.test(),对象方法的每个实例都在不同的进程中运行。 my_object构造函数创建并启动一个线程,test()应该通过队列向线程发送消息。然后该线程打印该消息。 my_object看起来像这样:

class my_object():
    class my_thread(threading.Thread):
        def __init__(self, message_queue):
            threading.Thread.__init__(self)
            self.message_queue = message_queue
        def run(self):
            while not self.message_queue.empty():
                try:
                    message = self.message_queue.get_nowait()
                    print message
                except Queue.Empty:
                    time.sleep(0.1)

    def __init__(self):
        self.message_queue = Queue.Queue()
        self.mythread = my_object.my_thread(self.message_queue)
        self.mythread.start()

    def test(self):
        print "Sending message"
        message = "test"
        self.message_queue.put(message)

当我开始这样的过程时:

if __name__ == "__main__":
    obj = my_object()
    p = Process(target=obj.test)
    p.start()
    p.join()

test()将执行print命令,但线程永远不会收到放在message_queue.上的消息当我启动这样的过程时:

def test():
   obj = my_object()
   obj.test() 
if __name__ == "__main__":
    p = Process(target=test)
    p.start()
    p.join()

我的代码按预期工作。

(请注意我的main方法和my_object代码位于不同的文件中)

我已经读过您无法挑选绑定方法,但我认为这仅适用于multiprocess.Pool,更不用说obj.test()正在执行,但它确实似乎无法访问my_object实例的其余部分。我的假设是多进程只是挑选test方法而不是对象实例的其余部分。那是对的吗?如果没有,为什么第二种方法有效,而不是第一种?

修改:包含my_object代码正文

0 个答案:

没有答案