适用于Linux和Windows的共享内存IPC解决方案



以下是一个简单而完美的Windows IPC共享内存解决方案,无需使用网络/套接字(在Windows上有令人讨厌的限制(。唯一的问题是它在Linux上不可移植:

避免使用标记参数将有助于保持代码在Unix和Windows之间的可移植性。

问题:Python中是否有一种简单的内置方法,而不需要条件分支"如果平台是Windows、如果平台是Linux;是否具有共享存储器mmap

类似的东西

mm = sharedmemory(size=2_000_000_000, name="id1234")  # 2 GB,  id1234 is a global
# id available for all processes
mm.seek(1_000_000)
mm.write(b"hello")

在Windows上内部默认为mmap.mmap(..., tagname="id1234"),在Linux上使用/dev/shm(或者可能是我不知道的更好的解决方案?(,在Mac上可能还有其他解决方案,但不必为每个不同的操作系统手动处理。


仅适用于Windows的解决方案:

#server
import mmap, time
mm = mmap.mmap(-1, 1_000_000_000, tagname="foo")
while True:
mm.seek(500_000_000)
mm.write(str(time.time()).encode())
mm.flush()
time.sleep(1)
# client
import mmap, time
mm = mmap.mmap(-1, 1_000_000_000, tagname="foo")
while True:
mm.seek(500_000_000)
print(mm.read(128))
time.sleep(1)

最简单的方法是使用版本>3.8,它增加了一个内置的共享内存抽象,它可以在windows和linux上运行https://docs.python.org/3.10/library/multiprocessing.shared_memory.html

代码看起来像这样:

流程#1:

from multiprocessing import shared_memory
# create=true to create a new shared memory instance, if it already exists with the same name, an exception is thrown
shm_a = shared_memory.SharedMemory(name="example", create=True, size=10)
shm_a.buf[:3] = bytearray([1, 2, 3])
while True:
do_smt()
shm_a.close()

流程#2:

from multiprocessing import shared_memory
# create=false, use existing
shm_a = shared_memory.SharedMemory(name="example", size=10)
print(bytes(shm.buf[:3]))
# [0x01, 0x02, 0x03]
while True:
do_smt()
shm_a.close()

否则,我认为没有共同的好的解决方案,你需要重新发明轮子:(

就我个人而言,这对我来说效果很好

选项1:http://www.inspirel.com/yami4/

用于通用计算的YAMI4套件是一个多语言、多平台的软件包。

几个操作系统:

样本代码

Microsoft Windows, POSIX (Linux, Max OS X, FreeBSD, ...), QNX (with native IPC messaging), FreeRTOS, ThreadX, TI-RTOS. Programming languages: C++, Ada, Java, .NET, Python, Wolfram.

选项2:ZeroMqhttps://zeromq.org/

相关内容

  • 没有找到相关文章

最新更新