在python中搜索IPC的有效解决方案时,我偶然发现了zeromq;我有几个python进程需要对来自主进程中的dict的数据进行一些cpu密集处理。这些工作进程只读取dict,只有主进程才能改变dict。 dict中的数据会发生变化,但会通过主进程自动进行。
理想情况下,我有一块共享内存,其中所有工作进程都可以读取dict,不幸的是这在python中似乎不可能。
使用像redis或memcache这样的缓存听起来有点矫枉过正(不想使用TCP& pickling来分享我已经在内存中以原生格式存在的东西)..
作为替代方案,我想使用zeromq将主数据库中的相关数据推送到使用zeromq IPC套接字的订阅工作者。这意味着我(不幸)必须从主dict序列化相关部分(使用msgpack?)然后使用zmq消息推送它。我读过可以使用零拷贝执行此操作,这样我就不会最终复制数据两次,如果我在msgpacked二进制字符串上使用copy = False,这会自动发生吗?这是解决我的问题的方法,还是你们有提示如何更有效地解决这个问题?
谢谢!
马亭
答案 0 :(得分:3)
是的,如果您使用copy=False
发送带有msgpacked的字节,则发送过程中不会有额外的内存数据副本(对于copy=False
的接收方也是如此)。
确保进行性能测试,因为更复杂的零拷贝机器的成本通常高于拷贝本身的成本,直到消息开始变得相当大(每个消息的交叉点大约为10s)。
另一种方法是您可以使用内置多处理模块的facilities for shared data。它不是最棒的,但对于相当简单的事情,它可以完成工作。