Python 使用pyzmq零拷贝共享数据

Python 使用pyzmq零拷贝共享数据,python,multiprocessing,ipc,zeromq,pyzmq,Python,Multiprocessing,Ipc,Zeromq,Pyzmq,在python中寻找IPC的有效解决方案时,我偶然发现了zeromq;我有几个python进程,它们需要在主进程中对来自dict的数据进行cpu密集型处理。这些工作进程仅从dict读取,只有主进程可以更改dict。dict中的数据将更改,但会通过主进程原子地更改 理想情况下,我应该有一块共享内存,所有工作进程都可以从中读取dict,不幸的是,这在python中似乎是不可能的 使用像redis或memcache这样的缓存听起来有点过分(不要使用TCP和pickling来以本机格式共享内存中已有的内

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

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

使用像redis或memcache这样的缓存听起来有点过分(不要使用TCP和pickling来以本机格式共享内存中已有的内容)

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

谢谢


Martijn

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

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


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

感谢您提供的信息,可能会有超过10kB的消息,并且有很多不同的IPC方法,不同的工具有不同的优势,这取决于工作量。我不认为有太多的共识,但ZeroMQ相对比较受欢迎。