遇到了同样的问题,我们需要使用from_buffer接口并希望只读访问。根据Python文档
https://docs.python.org/3/library/mmap.html,“对ACCESS_COPY内存映射的赋值会影响内存,但不会更新底层文件。”
如果您可以接受使用匿名文件备份,则可以使用ACCESS_COPY。
例如:打开两个cmd.exe或终端,在一个终端中:
mm_file_write = mmap.mmap(-1, 4096, access=mmap.ACCESS_WRITE, tagname="shmem")
mm_file_read = mmap.mmap(-1, 4096, access=mmap.ACCESS_COPY, tagname="shmem")
write = ctypes.c_int.from_buffer(mm_file_write)
read = ctypes.c_int.from_buffer(mm_file_read)
try:
while True:
value = int(input('enter an integer using mm_file_write: '))
write.value = value
print('updated value')
value = int(input('enter an integer using mm_file_read: '))
read.value = value
print('updated value')
except KeyboardInterrupt:
print('got exit event')
在另一个终端中执行以下命令:
mm_file = mmap.mmap(-1, 4096, access=mmap.ACCESS_WRITE, tagname="shmem")
i = None
try:
while True:
new_i = struct.unpack('i', mm_file[:4])
if i != new_i:
print('i: {} => {}'.format(i, new_i))
i = new_i
time.sleep(0.1)
except KeyboardInterrupt:
print('Stopped . . .')
你会发现,当第一个进程使用ACCESS_COPY进行写操作时,第二个进程不会接收到更新。