【问题标题】:Python multiprocessing - function-like communication between two processesPython多处理 - 两个进程之间的类似函数的通信
【发布时间】:2015-08-22 09:03:01
【问题描述】:

我遇到了以下问题:

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

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

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

例如,假设每个工作人员都存储一个整数(假设该工作人员收到的呼叫数)。在非并行处理中,我会使用这样的东西:

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 后,我遇到了管道关闭问题,除非通过连接发送两端。
  • 使用一个请求队列。每条消息都包含一个队列,用于返回对该请求的答案。失败,因为我无法通过队列发送队列,但减少技巧不起作用。
  • 上述内容也适用于各个 Manager 生成的对象。

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

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

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

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

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

    Beaver library 是一个很好的例子,展示了如何使用 ZeroMQ 队列在 python 中处理多处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 2016-01-24
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多