multiprocessing - 如何清除/覆盖共享内存中的所有数据?
问题描述
我需要覆盖共享内存(multiprocessing.shared_memory)中所有先前写入的数据。
这是示例代码:
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')
# First write to shared memory
shared.buf[0:len(_byte_data_one)] = _byte_data_one
print(f'Data: {shared.buf.tobytes()}')
# Second write
shared.buf[0:len(_byte_data_two)] = _byte_data_two
print(f'Data: {shared.buf.tobytes()}')
shared.close()
shared.unlink()
输出:
第一次写:b'{"ONE": 1, "TWO": 2}\x00\x00\x00\x00'
第二次写:b'{"ACTIVE": 1}WO": 2}\x00\x00\x00\x00'
输出是可以理解的,因为第二次写入从索引 0 开始并以_byte_data_two
长度结束。( shared.buf[0:len(_byte_data_two)] = _byte_data_two
)
我需要每次新写入共享内存来覆盖所有以前的数据。
我shared.buf[0:] = b''
在每次新写入共享内存之前都尝试过,但最终得到了
ValueError: memoryview assignment: lvalue and rvalue have different structures
我也在shared.buf[0:len(_bytes_data_two)] = b''
每次新写入后都尝试过,结果相同。
照顾这个结果:
第一次写入:b'{"ONE": 1, "TWO": 2}\x00\x00\x00\x00'
第二次写入:b'{"ACTIVE": 1}\x00\x00\x00\x00'
没有额外的“ WO”:2} “从第一次写入
如何覆盖共享内存中所有先前写入的数据?
解决方案
最简单的可能是首先创建一个零填充字节数组,例如:
def set_zero_filled(sm, data):
buf = bytearray(sm.nbytes)
buf[:len(data)] = data
sm.buf[:] = buf
您可以将其用作:
set_zero_filled(shared, json.dumps(data_two).encode())
推荐阅读
- c++ - 交叉乘法非类型可变参数模板
- python-3.x - 通过 SQLalchemy URI 调用 RDS 时 Lambda 函数卡住
- azure - ADB2C refresh_token 总是在一天后过期
- html - 在悬停 CSS 上选择第一个子 img 标签
- assembly - 在 8086 中将标志值存储在变量中 - 汇编语言
- r - 带有 DT 和 data.table 的闪亮绑定输入类在 R Shiny 中丢失
- robotframework - 如何在 Robot Framework 中执行延迟变量替换?
- python - 验证数据时出现 ValueError
- next.js - 没有服务器端渲染功能的导入模块
- azure - 在故障恢复时刷新 Redis 密钥