10

在 python 中寻找 IPC 的有效解决方案时,我偶然发现了 zeromq;我有几个 python 进程需要对来自主进程中的 dict 的数据进行一些 cpu 密集型处理。这些工作进程只从字典中读取,只有主进程可以更改字典。dict 中的数据会发生变化,但会通过主进程原子地发生变化。

理想情况下,我有一块共享内存,所有工作进程都可以从中读取字典,不幸的是,这在 python 中似乎是不可能的。

使用像 redis 或 memcache 这样的缓存听起来有点矫枉过正(不想使用 TCP 和酸洗来分享我已经在内存中以本机格式存在的东西)..

因此,作为替代方案,我想使用 zeromq 将相关数据从主 dict 推送到使用 zeromq IPC 套接字的订阅工作者。这意味着我(不幸的是)必须从主 dict 序列化相关部分(使用 msgpack?),然后使用 zmq 消息推送它。我读到可以使用零拷贝来做到这一点,这样我就不会最终复制数据两次,如果我在我的 msgpacked 二进制字符串上使用 copy=False 会自动发生这种情况吗?这是解决我的问题的方法还是你们有提示如何更有效地解决这个问题?

谢谢!

马汀

4

1 回答 1

7

是的,如果您使用 发送 msgpacked 字节copy=False,则发送进程的内存中不会有额外的数据副本(使用 接收方也是如此copy=False)。

确保进行性能测试,因为更复杂的零拷贝机器的成本通常大于拷贝本身的成本,直到消息开始变得相当大(每条消息交叉大约 10s kB)。

另一种方法是您可以只使用内置的多处理模块的工具来共享数据。它不是最棒的,但对于相当简单的事情它可以完成工作。

于 2013-06-27T23:14:49.657 回答