如何清除/覆盖共享内存中的所有数据?



我需要覆盖共享内存(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}x00x00x00x00'
第二次写入:b'{"ACTIVE": 1}WO": 2}x00x00x00x00'

输出是可以理解的,因为第二次写入从索引 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}x00x00x00x00'
第二次写入:b'{"ACTIVE": 1}x00x00x00x00',第一次写入时没有额外的">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())

相关内容

  • 没有找到相关文章

最新更新