【问题标题】:Efficient Python to Python IPC [closed]高效的 Python 到 Python IPC [关闭]
【发布时间】:2011-12-11 23:48:36
【问题描述】:

具有以下要求的inter-process communication (IPC) 框架\技术是什么:

  • 在两个 Python 进程之间传输原生 Python 对象
  • 时间和 CPU 效率高(RAM 效率无关)
  • 跨平台 Win\Linux
  • 很高兴拥有:与PyPy 合作

更新 1:进程位于同一主机上并使用相同版本的 Python 和其他模块

更新 2: 进程由用户独立运行,没有一个进程产生其他进程

【问题讨论】:

    标签: python ipc inter-process-communicat


    【解决方案1】:

    本机对象不会在进程之间共享(由于引用计数)。

    相反,您可以使用 unix 域套接字、mmap、zeromq 或为并发访问设计的 sqlite3 之类的中介来腌制和共享它们。

    【讨论】:

    • 你觉得 XML-RPC 怎么样?
    • 我喜欢 XML-RPC,但是 OP 的问题集中在 cpu 效率上,所以 xml-rpc 没有成功。
    • 酸洗需要时间和 CPU,但可以节省 RAM,我的要求正好相反。有没有办法在不腌制的情况下交流它们?
    • 一直在寻找一个使用mmap 在两个独立运行的脚本之间共享数据的简单示例,最后在这里找到了一个:Sharing Python data between processes using mmap | schmichael's blog - 但似乎您仍然需要打开一个文件并将要共享的数据存储在那里; mmap(显然)只是提供了一个特殊的接口来访问这个文件(否则我希望 mmap 可以直接利用内存,绕过临时文件)
    • @sdaau 关于将 mmap 绑定到临时文件:并非如此。您可以创建所谓的匿名 mmap,它不依赖于文件,但共享区域仅适用于同一进程上的线程(当然),或者在创建 mmap 后分叉的子进程,所以它对这里的要求没用
    【解决方案2】:

    使用multiprocessing 开头。

    如果您需要多个 CPU,请查看 celery

    【讨论】:

    • multiprocessing 是否与相互依赖运行的进程相关? (不是彼此产生的)
    • @Jonathan:“相互依赖”?多处理包提供队列和管道,以便进程可以相互同步并传递对象。这是否符合“相互依存”的条件?
    • 我的意思当然是独立...
    • @Jonathan:这是要求吗?如果是这样,请更新问题以包含所有事实。该软件包提供了许多功能,用于构建使用 Internet 协议进行通信的分布式服务器。 docs.python.org/library/…
    【解决方案3】:

    execnetPyro 都提到了 PyPy <-> CPython 通信。 Python Wiki 的 Parallel Processing 页面中的其他包可能也适合。

    【讨论】:

    • Afaik execnet 必须设置它自己的进程。
    【解决方案4】:

    经过一些测试,我发现以下方法适用于使用mmap的Linux。

    Linux 有/dev/shm。如果您使用 POSIX shm_open 创建共享内存,则会在此文件夹中创建一个新文件。

    虽然python的mmap模块不提供shm_open函数。我们可以使用普通的open/dev/shm 中创建一个文件,它实际上是相似的并且驻留在内存中。 (使用os.unlink 删除)

    然后对于 IPC,我们可以使用mmap 将该文件映射到不同进程的虚拟内存空间。所有进程共享该内存。 Python 可以将内存用作缓冲区并在其上创建对象,例如字节和 numpy 数组。或者我们可以通过ctypes接口使用。

    当然,仍然需要进程同步原语来避免竞争条件。

    参见mmap docctypes docnumpy.load,其中有一个mmap_mode 选项。

    【讨论】:

    • 我知道这个答案很老了..但我会试一试!既然可以在 /dev/shm 中打开文件,那么使用 mmap 的目的是什么?我不能通过读取和写入 /dev/shm 中的文件在不同的应用程序之间来回传递信息吗?据我了解,这些不会写入硬盘驱动器?
    • 虽然我没有测试你说的,但我觉得应该也可以。但是映射它可能更方便,以便您像变量而不是文件一样使用内存。很高兴看到您对实验的更新。
    【解决方案5】:

    Parallel Python 可能值得一看,它适用于 Windows、OS X 和 Linux(我似乎记得我不久前在 UltraSPARC Solaris 10 机器上使用过它)。我不知道它是否适用于 PyPy,但它does seem to work with Psyco

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 2015-12-21
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多