Python多处理—两个进程之间类似函数的通信

Python多处理—两个进程之间类似函数的通信,python,multiprocessing,Python,Multiprocessing,我有以下问题: 我有两个不同的班级;让我们把它们称为接口和工作者。接口应该接受来自外部的请求,并将它们多路传输给多个工作者 与我发现的几乎每一个例子相反,我有几个特点: 不应为每个请求重新创建工人 工人是不同的;工作人员[1]无法答复对工作人员[0]的请求。此多路复用在接口中完成 我有许多类似函数的调用,很难通过事件或简单队列进行建模 有几个不同的请求,这使得每个请求都有一个队列很困难 例如,假设每个worker都存储一个整数(假设该worker接收到的呼叫数)。在非并行处理中,我会使用如下

我有以下问题:

我有两个不同的班级;让我们把它们称为
接口
工作者
。接口应该接受来自外部的请求,并将它们多路传输给多个工作者

与我发现的几乎每一个例子相反,我有几个特点:

  • 不应为每个请求重新创建工人
  • 工人是不同的;
    工作人员[1]
    无法答复对
    工作人员[0]
    的请求。此多路复用在
    接口中完成
  • 我有许多类似函数的调用,很难通过事件或简单队列进行建模
  • 有几个不同的请求,这使得每个请求都有一个队列很困难
例如,假设每个worker都存储一个整数(假设该worker接收到的呼叫数)。在非并行处理中,我会使用如下内容:

class interface(object):
    workers = None #set somewhere else.

    def get_worker_calls(self, worker_id):
        return self.workers[worker_id].get_calls()

class worker(object)
    calls = 0

    def get_calls(self):
        self.calls += 1
        return self.calls

这显然是行不通的。这是什么意思

或者,更相关的是,我没有多处理的经验。有没有一个我遗漏的设计范例可以轻松解决上述问题

谢谢

作为参考,我考虑了几种方法,但没有找到一种好的方法:

  • 使用一个请求和应答队列。我放弃了这个想法,因为这要么会阻塞当前工作人员的回答时间(使其可伸缩性差),要么会要求我发送额外的信息
  • 使用一个请求队列。每条消息都包含一个管道,用于返回该请求的答案。修复后,我遇到了管道关闭的问题,除非通过连接发送两端
  • 使用一个请求队列。每条消息都包含一个队列,用于返回该请求的答案。失败,因为我无法通过队列发送队列,但缩减技巧不起作用
  • 上述内容也适用于各个管理器生成的对象

多处理意味着您有2个以上的独立进程在运行。无法从一个进程直接访问另一个进程的内存(与多线程一样)

您最好使用某种外部队列机制,您可以从或开始。RQ比较简单,但芹菜有内置的监控功能

但您必须知道,只有当芹菜/RQ能够“打包”所需的函数/类并将它们发送到其他进程时,多处理才会起作用。因此,您必须使用_主_级函数(位于文件顶部,不属于任何类)

您可以自己实现它,Redis非常简单,ZeroMQ和RabbitMQ也很好


是如何使用ZeroMQ队列在python中处理多处理的一个很好的示例。

多处理意味着有2个以上的独立进程在运行。无法从一个进程直接访问另一个进程的内存(与多线程一样)

您最好使用某种外部队列机制,您可以从或开始。RQ比较简单,但芹菜有内置的监控功能

但您必须知道,只有当芹菜/RQ能够“打包”所需的函数/类并将它们发送到其他进程时,多处理才会起作用。因此,您必须使用_主_级函数(位于文件顶部,不属于任何类)

您可以自己实现它,Redis非常简单,ZeroMQ和RabbitMQ也很好

这是如何使用ZeroMQ队列在python中处理多处理的一个很好的示例