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.
多个操作系统:
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/
下面是一个简单而完美的 Windows 解决方案,适用于具有共享内存的 IPC,无需使用网络/套接字(在 Windows 上有
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.
多个操作系统:
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.