You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何覆盖multiprocessing.shared_memory中的全部已有数据?

如何完全覆盖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:32:08