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

Shared-memory IPC solution for both Linux and Windows

下面是一个简单而完美的 Windows 解决方案,适用于具有共享内存的 IPC,无需使用网络/套接字(在 Windows 上有 )。 唯一的问题是 not portable 在 Linux:

Avoiding the use of the tag parameter will assist in keeping your code portable between Unix and Windows.

问题:Python中是否有内置的简单方法,没有条件分支“if platform is Windows,if platform is 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 上的其他内容,但不必为每个不同的 OS.

手动处理

仅适用于 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 的 python,它为共享内存添加了一个 built-in 抽象, 它适用于 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/

The YAMI4 suite for general computing is a multi-language and multi-platform package.

多个操作系统:

Sample code

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:ZeroMq https://zeromq.org/