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

Python多处理中运行和启动时的不同行为,python,python-multiprocessing,Python,Python Multiprocessing,我试图在Python程序中启动多个进程,使用multiprocessing.Queue在它们之间共享数据 我的代码如下所示,TestClass是从zmq套接字接收数据包并将其送入队列的过程。还有另一个进程(我从代码中取出)一直从队列中获取消息。我还运行了一个脚本来将消息发布到这个zmq频道 from multiprocessing import Process, Queue import zmq import time class TestClass(Process): def __i

我试图在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()
行上,无法获取任何传入消息。谁能解释一下,并提出一个好的解决方案?谢谢

问题是您正在父进程中创建
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

如果您将
super(…)
self.queue=queue
以外的所有内容从
\uuuu init\uuuuu
移动到
run
,并使用
c.start()
启动流程,事情是否正常运行?@dano是的,它可以。。。这背后有什么魔力?