如何覆盖multiprocessing.shared_memory中的全部已有数据?
咱们先聊聊你遇到的问题:第二次往共享内存写数据时,只覆盖了前半段内容,旧数据的尾巴"WO": 2}还留在内存里,确实挺闹心的。你尝试用shared.buf[0:] = b''清空失败,是因为memoryview的赋值要求左右两边的字节数必须完全匹配——空字节长度为0,而你的共享内存是24字节,长度不匹配肯定会抛出ValueError。
下面给你两种靠谱的解决方法:
方法一:先全量清空内存,再写入新数据
这种方法最直观,每次写入前把整个共享内存填充为零字节,再写入新内容,确保旧数据被彻底覆盖:
from multiprocessing import shared_memory import json shared = shared_memory.SharedMemory(create=True, size=24, name='TEST') data_one = {'ONE': 1, 'TWO': 2} data_two = {'ACTIVE': 1} _byte_data_one = bytes(json.dumps(data_one), encoding='ascii') _byte_data_two = bytes(json.dumps(data_two), encoding='ascii') # 第一次写入:刚创建的内存默认是零,不过手动清空更稳妥 shared.buf[:] = b'\x00' * shared.size shared.buf[0:len(_byte_data_one)] = _byte_data_one print(f'First write: {shared.buf.tobytes()}') # 第二次写入:先清空所有旧数据,再写入新内容 shared.buf[:] = b'\x00' * shared.size shared.buf[0:len(_byte_data_two)] = _byte_data_two print(f'Second write: {shared.buf.tobytes()}') shared.close() shared.unlink()
方法二:只覆盖新数据之外的剩余区域
如果共享内存比较大,全量清空有点浪费性能,可以只把新数据长度之后的部分设为零:
# 第二次写入的优化写法 shared.buf[0:len(_byte_data_two)] = _byte_data_two # 将新数据末尾到内存结束的部分填充为零 shared.buf[len(_byte_data_two):] = b'\x00' * (shared.size - len(_byte_data_two)) print(f'Second write: {shared.buf.tobytes()}')
运行上面的代码,第二次写入的输出就会变成你想要的:
Second write: b'{"ACTIVE": 1}\x00\x00\x00\x00'
这样就彻底解决了旧数据残留的问题啦。
内容的提问来源于stack exchange,提问作者Temperosa
相关产品推荐
相关产品推荐

