【问题标题】:Sharing data using pyzmq zero-copy使用pyzmq零拷贝共享数据
【发布时间】:2013-06-25 14:26:04
【问题描述】:

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

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

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

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

谢谢!

马丁

【问题讨论】:

    标签: python multiprocessing ipc zeromq pyzmq


    【解决方案1】:

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

    确保进行性能测试,因为在消息开始变得相当大之前,更复杂的零拷贝机制的成本通常高于拷贝本身的成本(每条消息交叉大约 10 KB)。

    另一种方法是您可以只使用内置多处理模块的facilities for shared data。这不是最棒的,但对于相当简单的事情它可以完成工作。

    【讨论】:

    • 感谢您的信息,可能会有 >10kB 和
    • IPC有很多不同的方法,不同的工具有不同的优势,具体取决于工作量。我认为没有太多共识,但 ZeroMQ 比较流行。
    猜你喜欢
    • 2014-10-25
    • 2010-12-11
    • 1970-01-01
    • 2011-07-05
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多