我正在尝试在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()
行,无法获取任何传入消息。任何人都可以解释一下并建议一个好的解决方案吗?感谢
答案 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