在Python多处理中运行和启动的不同行为

时间:2015-07-19 23:02:14

标签: python python-multiprocessing

我正在尝试在Python程序中启动多个进程,使用multiprocessing.Queue在它们之间共享数据。

我的代码如下所示,TestClass是从zmq套接字接收数据包并将它们提供给队列的进程。还有另一个进程(我从代码中取出)继续从队列中获取消息。我还运行了一个脚本来向此zmq频道发布消息。

from multiprocessing import Process, Queue
import zmq
import time

class TestClass(Process):
    def __init__(self, queue):
        super(TestClass, self).__init__()

        # Setting up connections
        self.context = zmq.Context()
        self.socket = self.context.socket(zmq.SUB)
        self.socket.connect("tcp://192.168.0.6:8577")
        self.socket.setsockopt(zmq.SUBSCRIBE, b'')
        self.queue = queue

    def run(self):

        while True:
            msg = self.socket.recv()
            self.queue.put(msg)


queue = Queue()
c = TestClass(queue)
c.run()
# Do something else

如果我使用c.run()启动进程,它运行正常,但它不是作为进程启动的,因为它会阻止以下语句。

然后我切换到c.start()开始进程,但它被卡在socket.recv()行,无法获取任何传入消息。任何人都可以解释一下并建议一个好的解决方案吗?感谢

1 个答案:

答案 0 :(得分:3)

问题是您在父进程中创建了zmq套接字,但之后尝试在子进程中使用它。分叉过程中的某些东西会破坏套接字,因此当您尝试使用它时它不起作用。您可以通过简单地在子节点而不是父节点中创建套接字来修复它。这没有负面的副作用,因为你不是试图在父母中使用套接字开始。

from multiprocessing import Process, Queue
import zmq
import time

class TestClass(Process):
    def __init__(self, queue):
        super(TestClass, self).__init__()
        self.queue = queue

    def run(self):
        # Setting up connections
        self.context = zmq.Context()
        self.socket = self.context.socket(zmq.SUB)
        self.socket.connect("tcp://192.168.0.6:8577")
        self.socket.setsockopt(zmq.SUBSCRIBE, b'')

        while True:
            msg = self.socket.recv()
            self.queue.put(msg)


if __name__ == "__main__":
    queue = Queue()
    c = TestClass(queue)
    c.start()  # Don't use run()
    # Do something else