Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高效的Python到Python IPC_Python_Ipc_Inter Process Communicat - Fatal编程技术网

高效的Python到Python IPC

高效的Python到Python IPC,python,ipc,inter-process-communicat,Python,Ipc,Inter Process Communicat,具有以下要求的框架\技术是什么: 在两个Python进程之间传输本机Python对象 高效的时间和CPU(RAM效率无关) 跨平台Win\Linux 很高兴拥有:与您一起工作 更新1:这些进程位于同一主机上,并使用相同版本的Python和其他模块 更新2:这些进程由用户独立运行,没有一个会产生其他进程 如果需要多个CPU,请查看。本机对象不会在进程之间共享(由于引用计数) 相反,您可以使用unix域套接字、mmap、zeromq或设计用于并发访问的sqlite3这样的中介对它们进行pickl

具有以下要求的框架\技术是什么:

  • 在两个Python进程之间传输本机Python对象
  • 高效的时间和CPU(RAM效率无关)
  • 跨平台Win\Linux
  • 很高兴拥有:与您一起工作
更新1:这些进程位于同一主机上,并使用相同版本的Python和其他模块

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


如果需要多个CPU,请查看。

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


相反,您可以使用unix域套接字、mmap、zeromq或设计用于并发访问的sqlite3这样的中介对它们进行pickle和共享。

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

两者都适用,并提及
PyPyCpython
通信。pythonwiki页面上的其他包可能也适用。

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

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

尽管python的
mmap
模块没有提供
shm_open
功能。我们可以使用一个普通的
open
/dev/shm
中创建一个文件,它实际上是类似的,并且驻留在内存中。(使用
os.unlink
将其删除)

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

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


请参阅,其中有一个
mmap_模式
选项。

您对XML-RPC有何看法?我喜欢XML-RPC,但OP的问题集中在cpu效率上,因此XML-RPC没有成功。酸洗需要时间和cpu,但节省RAM,我的要求正好相反。有没有一种方法可以在不酸洗的情况下与它们通信?我们正在寻找一个简单的示例,说明如何使用
mmap
在两个独立运行的脚本之间共享数据,最后在这里找到了一个示例:-但您似乎仍然必须打开一个文件并将要共享的数据存储在那里;mmap(显然)只是提供了一个特殊的接口来访问这个文件(否则我希望mmap可以直接利用内存,绕过临时文件)@sdaau关于mmap绑定到临时文件:不是真的。您可以创建所谓的匿名mmap,它不依赖于文件,但共享区域仅适用于同一进程上的线程(当然)或创建mmap后分叉的子进程,因此,对于与相互依赖运行的进程相关的
多处理
需求来说,它没有用处?(不是彼此产生的)@Jonathan:“相互依赖”?多处理包提供队列和管道,以便进程可以彼此同步并传递对象。这符合“相互依存”的条件吗?我是说当然是独立的…@乔纳森:这是要求吗?如果是这样,请更新问题以包括所有事实。该软件包提供了许多功能,用于构建使用internet协议进行通信的分布式服务器。Afaik execnet必须设置自己的进程。我知道这个答案很古老。。但我要试一试!既然可以在/dev/shm中打开文件,那么使用mmap的目的是什么?我不能通过读写/dev/shm中的文件在不同的应用程序之间来回传递信息吗?据我所知,这些文件不会被写入硬盘?虽然我没有测试你说的内容,但我觉得应该也可以。但是,为了让您像使用变量而不是文件一样使用内存,映射它可能更方便。很高兴看到你的实验更新。