python进程之间的共享内存

时间:2012-07-02 23:40:41

标签: python c shared-memory

我正试图想出一种在python进程之间共享内存的方法。基本上存在多个python进程需要能够READ(仅读取)和使用(无突变)的对象。现在这是使用redis + strings + cPickle实现的,但cPickle占用宝贵的CPU时间,所以我不想使用它。我在互联网上看到的大多数python共享内存实现似乎都需要文件和泡菜,这基本上就是我正在做的事情以及我正在努力避免的事情。

我想知道的是,是否有办法编写类似...基本上是内存中的python对象数据库/服务器以及与数据库接口的相应C模块?

基本上C模块会向服务器请求写入对象的地址,服务器会用地址响应,然后模块会写入对象,并通知服务器具有给定键的对象被写入指定位置的磁盘。然后,当任何进程想要使用给定键检索对象时,他们只会向db请求给定键的内存位置,服务器将响应该位置,并且模块将知道如何在内存中加载该空间。将python对象传回python进程。

这完全不合理还是真的很难实施?我在追逐那些不可能的东西吗?欢迎大家提出意见。谢谢你的互联网。

3 个答案:

答案 0 :(得分:5)

不无道理。

IPC可以使用内存映射文件完成。 Python内置了功能:

http://docs.python.org/library/mmap.html

只需在两个进程中对该文件进行mmap,然后he-presto您有一个共享文件。当然,您必须在两个流程中轮询它以查看更改。而且你必须在两者之间合作。并确定您希望将数据放入哪种格式。但这是解决问题的常用方法。

答案 1 :(得分:3)

如果您不想进行酸洗,multiprocessing.sharedctypes可能适合。但它有点低级别;您获得单个值或指定类型的数组。

将数据分发到子进程(单向)的另一种方法是multiprocessing.Pipe。这可以处理Python对象,它是用C实现的,所以我不能告诉你它是否使用酸洗。

答案 2 :(得分:2)

从Python 3.8起,您可以使用multiprocessing.shared_memory.SharedMemory