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

时间:2015-08-22 09:03:01

标签: python multiprocessing

我遇到了以下问题:

我有两个不同的班级;我们称之为interfaceworker。接口应该接受来自外部的请求,并将它们多路复用到多个工作者。

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

  • 不应该为每个请求重新创建工作人员。
  • 工人不同; workers[0]无法回答workers[1]的请求。这种多路复用在interface
  • 中完成
  • 我有许多类似函数的调用,很难通过事件或简单队列进行建模。
  • 有一些不同的请求,这会使每个请求的一个队列变得困难。

例如,假设每个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

这显然不起作用。是什么?

或者,或许更相关,我没有多处理经验。我是否缺少一种可以轻松解决上述问题的设计范式?

谢谢!

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

  • 使用一个请求和应答队列。我已经放弃了这个想法,因为它会阻止当前工作人员的答案时间interface'(使其可扩展性很差),或者要求我发送额外信息。
  • 使用一个请求队列。每条消息都包含一个管道,用于返回该请求的答案。在修复issue with being unable to send pipes via pipes之后,我遇到管道关闭问题,除非通过连接发送两端。
  • 使用一个请求队列。每条消息都包含一个队列,用于返回该请求的答案。失败,因为我不能通过队列发送队列,但减少技巧不起作用。
  • 以上内容也适用于各自经理生成的对象。

1 个答案:

答案 0 :(得分:0)

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

您最好的方法是使用某种外部队列机制,您可以从CeleryRQ开始。 RQ更简单,但芹菜内置监控。

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

你总是可以自己实现,Redis很简单,ZeroMQ和RabbitMQ也很好。

Beaver library是如何使用ZeroMQ队列处理python中的多处理的好例子。