在python中寻找有效的IPC解决方案时,我偶然发现了zeromq;我有几个python进程,它们需要在主进程中对dict中的数据进行一些cpu密集型处理。这些工作进程只能从dict中读取,只有主进程可以更改dict。dict中的数据将会更改,但会通过主进程自动更改。
理想情况下,我会有一块共享内存,所有的工作进程都可以从中读取字典,不幸的是,这在python中似乎是不可能的。
使用诸如redis或memcache之类的缓存听起来有点过头(我不想使用TCP & pickling来以本机格式共享我在内存中某处已有的内容)..
因此,作为另一种选择,我想使用zeromq将相关数据从主字典推送到使用zeromq IPC套接字的订阅工作者。这意味着(不幸的是)我必须序列化主dict中的相关部分(使用msgpack?)然后使用zmq消息推送它。我读到可以使用零拷贝来做这件事,这样我就不会复制两次数据,如果我在我的msgpacked二进制字符串上使用copy=False,这会自动发生吗?这是解决我的问题的方法吗,或者你们有没有更有效地解决这个问题的建议?
谢谢!
马提金
发布于 2013-06-28 07:14:50
是的,如果你用copy=False发送你的msgpacked字节,在发送过程中不会有额外的数据拷贝在内存中(同样的情况也适用于使用copy=False的接收端)。
一定要做性能测试,因为在消息变得相当大之前,更复杂的零拷贝机制的成本通常会高于拷贝本身的成本(每条消息大约有10个kB的交叉)。
另一种方法是,您可以只使用内置多处理模块的facilities for shared data。它不是最棒的,但对于相当简单的事情,它可以完成工作。
https://stackoverflow.com/questions/17354109
复制相似问题