以下是一个简单而完美的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.