高效的Python到Python进程间通信

32

以下是符合以下要求的进程间通信(IPC)框架/技术:

  • 在两个Python进程之间传输本地Python对象
  • 时间和CPU高效(RAM效率无关紧要)
  • 跨平台Win\Linux
  • 最好:与PyPy兼容

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

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

5个回答

21

原生对象由于引用计数的原因不能在进程之间共享。

可以使用pickle并使用unix域套接字、mmap、zeromq或中介(如sqlite3)进行共享。


3
我喜欢使用XML-RPC,但OP的问题关注CPU效率,所以XML-RPC不符合要求。 - Raymond Hettinger
2
序列化需要时间和 CPU,但可以节省 RAM,而我的要求恰好相反。有没有一种方法可以在不进行序列化的情况下进行通信? - Jonathan Livni
1
一直在寻找一个简单的mmap使用示例,以在两个独立运行的脚本之间共享数据,最终在这里找到了一个:Sharing Python data between processes using mmap | schmichael's blog - 但似乎仍然需要打开文件并将要共享的数据存储在那里; mmap(显然)只是提供了一个特殊的接口来访问此文件(我原本希望mmap可以直接利用内存,而不是绕过临时文件)。 - sdaau
关于mmap被绑定到临时文件的问题:并不完全如此。您可以创建所谓的匿名mmap,它不依赖于文件,但是共享区域仅对同一进程中的线程(当然),或在创建mmap之后分叉的子进程可用,因此它不能满足此处的要求。 - Ricardo Cárdenes
@RicardoCárdenes,posix定义了shm_open函数来创建内存文件,可以用于避免使用临时文件,Python是否也有类似的功能? - doraemon
显示剩余3条评论

10

4
对于相互独立运行(不是由彼此生成)的进程,multiprocessing 是否相关? - Jonathan Livni
@Jonathan: "相互依赖"?多进程包提供了队列和管道,以便进程之间可以同步并传递对象。这是否符合“相互依赖”的要求? - S.Lott
5
当然,我是指独立地…… - Jonathan Livni
2
@Jonathan:这是一个要求吗?如果是,请更新问题以包含所有事实。该软件包提供了许多功能,用于构建使用Internet协议进行通信的分布式服务器。http://docs.python.org/library/multiprocessing.html#module-multiprocessing.connection - S.Lott

6

据我所知,execnet必须设置自己的进程。 - NirIzr

6
经过一些测试,我发现以下方法适用于在Linux上使用mmap
Linux有/dev/shm。如果您使用POSIX的shm_open创建共享内存,则会在此文件夹中创建一个新文件。
虽然Python的mmap模块不提供shm_open函数。但我们可以使用普通的open/dev/shm中创建一个文件,它实际上类似并驻留在内存中。(使用os.unlink将其删除)
然后,对于IPC,我们可以使用mmap将该文件映射到不同进程的虚拟内存空间。所有进程共享该内存。Python可以使用该内存作为缓冲区,并在其上创建像字节和numpy数组之类的对象。或者我们可以通过ctypes接口来使用它。
当然,仍需要进程同步原语以避免竞态条件。
请参阅mmap文档ctypes文档和带有mmap_mode选项的numpy.load

我知道这个答案很老了,但我会尝试回答!既然可以在/dev/shm中打开文件,那么使用mmap的目的是什么?我不能只通过读写/dev/shm中的文件来在不同的应用程序之间传递信息吗?据我所知,这些文件不会被写入硬盘? - RedSmolf
虽然我没有测试你所说的内容,但我感觉应该也没问题。不过,将其映射为变量而不是文件可能更方便,以便您可以像使用变量一样使用内存。很高兴看到您对实验的更新。 - doraemon

5

Parallel Python 可以值得一试,它可以在 Windows、OS X 和 Linux 上运行(我记得我曾经在一台 UltraSPARC Solaris 10 机器上使用过它)。我不知道它是否适用于 PyPy,但是似乎适用于 Psyco


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接