【发布时间】:2012-07-03 09:32:33
【问题描述】:
我正在尝试找出一种在 python 进程之间共享内存的方法。基本上存在多个python进程需要能够读取(仅读取)和使用(无突变)的对象。现在这是使用 redis + strings + cPickle 实现的,但是 cPickle 占用了宝贵的 CPU 时间,所以我不想使用它。我在互联网上看到的大多数 python 共享内存实现似乎都需要文件和泡菜,这基本上是我已经在做的并且正是我想要避免的。
我想知道是否有办法编写类似...基本上是内存中的python对象数据库/服务器和相应的C模块来与数据库接口?
基本上,C 模块会向服务器询问要写入对象的地址,服务器会以地址响应,然后模块会写入对象,并通知服务器具有给定键的对象已写入磁盘在指定位置。然后,当任何进程想要使用给定键检索对象时,它们只需向数据库询问给定键的内存位置,服务器将响应该位置,模块将知道如何在内存中加载该空间并将python对象传回python进程。
这完全不合理还是真的很难实施?我在追求不可能的事情吗?欢迎大家提出意见。感谢互联网。
【问题讨论】:
-
您的 CPU 时间到底有多么宝贵,值得放弃一个工作解决方案,该解决方案在保持同步方面比您建议的要简单得多?您所要求的可以完成,但要做到正确将是一个巨大的痛苦。
-
CPU时间是最宝贵的。基本上 unpickling 对象可能需要 20 毫秒(对于小对象)到 60 毫秒(对于大对象)。我个人觉得这两个时间都太长了。编辑:太长了,因为必须有更好的方法,而不是我认为 cPickle 不够努力。
-
共享内存是可行的,但共享对象将非常困难......可以在这里找到一个相关的问题:*.com/questions/1268252/…(Alex Martelli 的一篇很好的文章解释了为什么这很难)。
-
@f34r 是否已知酸洗是您当前代码库中的主要瓶颈或至少是一个重要的瓶颈?如果没有,您的 CPU 时间实际上供应充足。如果您的数据不是真正持久的,并且仅直接发送腌制值来替换它,您也许可以提出转储 Redis 的理由。但我的直觉是,如果没有序列化消息,就不可能有一个“无共享”的分布式架构,而且它们比共享内存系统更容易推理。
-
我想你也可以看看sharing mechanisms of the
multiprocessingmodule。 (该段的第一句话当然建议不要这样做。)
标签: python c shared-memory