2013-06-27 14 views
5

当在python中搜索IPC的高效解决方案时,我偶然发现了zeromq;我有几个python进程需要对主进程中的字典中的数据进行一些cpu密集处理。这些工作进程只能从字典中读取,只有主进程可以改变字典。字典中的数据将会改变,但通过主进程原子化。使用pyzmq zero-copy共享数据

我理想上有一段共享内存,所有的工作进程都可以读取字典,不幸的是,这似乎不可能在Python中。

使用Redis的一样或记忆快取缓存听起来有点小题大做(不想使用TCP &酸洗只是分享一些我已经在本机格式存储的地方)..

所以作为替代,我想使用zeromq将master dict中的相关数据推送到使用zeromq IPC套接字订阅工作人员。这意味着我会(不幸地)必须从master dict(使用msgpack?)序列化相关部分,然后使用zmq消息推送它。我读了它可以做到这一点使用零拷贝,所以我不会最终复制数据两次,这是自动发生的事情,如果我对我的msgpacked二进制字符串使用copy = False?这是为我的问题去的方式,还是你有提示如何更有效地解决这个问题?

谢谢!

的Martijn

回答

3

是的,如果你有copy=False发送您msgpacked字节,将有内存的发送过程中的数据没有额外的副本(这同样适用于接收端与copy=False)。

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

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

+0

感谢您的信息,可能会有消息> 10kB和<10kB,所以我将明确地必须做一些基准测试.. 是否有任何共识什么是最有效的方式之间的IPC进程之间的IPC是?只需使用多处理程序包并使用管道? – Martijnh

+0

IPC有很多不同的方法,根据工作量的不同,各种工具具有不同的优势。我认为没有太大的共识,但是ZeroMQ比较流行。 – minrk