ZeroMQ挂在python多处理类/对象解决方案中

保罗·斯托克

我正在尝试在Python(pyzmq)中将ZeroMQ与多处理一起使用。作为一个最小的(不可行的)示例,我有一个服务器类和一个客户端类,它们都继承自multiprocessing.Process客户端作为子进程应向服务器子进程发送一条消息,该进程应打印该消息:

#mpzmq_class.py

from multiprocessing import Process
import zmq


class Server(Process):
    def __init__(self):
        super(Server, self).__init__()
        self.ctx = zmq.Context()
        self.socket = self.ctx.socket(zmq.PULL)
        self.socket.connect("tcp://localhost:6068")

    def run(self):
        msg = self.socket.recv_string()
        print(msg)


class Client(Process):
    def __init__(self):
        super(Client, self).__init__()
        self.ctx = zmq.Context()
        self.socket = self.ctx.socket(zmq.PUSH)
        self.socket.bind("tcp://*:6068")

    def run(self):
        msg = "Hello World!"
        self.socket.send_string(msg)

if __name__ == "__main__":
    s = Server()
    c = Client()
    s.start()
    c.start()
    s.join()
    c.join()

现在,如果运行此命令,服务器进程似乎会挂在receive-call上msg = socket.receive_string()在另一个(更复杂的)情况下,它甚至挂在-socket.connect("...")语句上。

如果我重写脚本以使用函数而不是类/对象,那么它将运行良好:

# mpzmq_function.py

from multiprocessing import Process
import zmq


def server():
    ctx = zmq.Context()
    socket = ctx.socket(zmq.PULL)
    socket.connect("tcp://localhost:6068")
    msg = socket.recv_string()
    print(msg)


def client():
    ctx = zmq.Context()
    socket = ctx.socket(zmq.PUSH)
    socket.bind("tcp://*:6068")
    msg = "Hello World!"
    socket.send_string(msg)

if __name__ == "__main__":
    s = Process(target=server)
    c = Process(target=client)
    s.start()
    c.start()
    s.join()
    c.join()

输出:

paul@AP-X:~$ python3 mpzmq_function.py 
Hello World!

有人可以帮我吗?我想这是我对多处理的使用不了解的东西。

谢谢!

DeaD_EyE

我遇到了同样的问题。我想问题是,run方法无法访问上下文对象。可能与C实现有关,并且事实是进程没有共享内存。如果在run方法中实例化上下文,它将起作用。

这是一个工作示例:

#mpzmq_class.py

from multiprocessing import Process
import zmq


class Base(Process):
    """
    Inherit from Process and
    holds the zmq address.
    """
    def __init__(self, address):
        super().__init__()
        self.address = address


class Server(Base):
    def run(self):
        ctx = zmq.Context()
        socket = ctx.socket(zmq.PULL)
        socket.connect(self.address)
        msg = socket.recv_string()
        print(msg)


class Client(Base):
    def run(self):
        ctx = zmq.Context()
        socket = ctx.socket(zmq.PUSH)
        socket.bind(self.address)
        msg = "Hello World!"
        socket.send_string(msg)


if __name__ == "__main__":
    server_addr = "tcp://127.0.1:6068"
    client_addr = "tcp://*:6068"
    s = Server(server_addr)
    c = Client(client_addr)
    s.start()
    c.start()
    s.join()
    c.join()

我添加了一个基类,以演示您仍然可以从run方法访问普通的Python对象。如果将上下文对象放入init方法中,它将无法正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有多处理功能的python中IPC的优雅解决方案

使用多处理的数独解决方案

Python 3中的密码算术类通用解决方案

挂在多处理队列中

在 main 中调用解决方案类

对象中的Python多处理

使用多处理解决方案实现 merge_sort

Python多处理池挂在连接处?

Python多处理池挂在连接处?

Java中的自然语言处理解决方案?

无法对timedelta对象求和;先前推荐的解决方案在python 3.7中不起作用

在解决方案中显示类名称的ComboBox项

Python中的N皇后回溯:如何返回解决方案而不是打印解决方案?

在javascript中创建结构对象的解决方案

从图像中剪切对象的解决方案/算法-Android

是否有通过在具体方法的抽象类中定义来处理事务的解决方案?

如何使用本机可视化程序在不同的解决方案中处理相似的类名

PrefixAgainbat中的解决方案

访问Aspect中的HttpServletRequest对象。提到的两个解决方案中哪个是更好的解决方案

在基于第三方ElasticSearch解决方案的解决方案中创建对象模型

如何用多个解决方案来解决多项式,包括python中的复杂解决方案?

Python列表中的交替方向-更多Pythonic解决方案

Python在O(1)解决方案中引发算术错误

从Python列表中删除重复项的更好解决方案

二进制搜索在 Python 中的解决方案

python中的方程式解决方案集

Python中的Excel Solver解决方案。西皮不工作

Selenium 和 Python 中的 ElementClickInterceptedException 解决方案

在 python 中从 Wolfram alpha 获取解决方案