首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除/覆盖共享内存中的所有数据?

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

Stack Overflow用户
提问于 2019-11-09 09:16:04
回答 1查看 631关注 0票数 0

我需要覆盖共享内存(multiprocessing.shared_memory)中所有以前写入的数据。

下面是示例代码:

代码语言:javascript
复制
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}“来自第一次写入

如何覆盖共享内存中以前写入的所有数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-09 14:08:26

最简单的方法可能是首先创建一个零填充字节数组,如下所示:

代码语言:javascript
复制
def set_zero_filled(sm, data):
  buf = bytearray(sm.nbytes)
  buf[:len(data)] = data
  sm.buf[:] = buf

您可以将其用作:

代码语言:javascript
复制
set_zero_filled(shared, json.dumps(data_two).encode())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58777883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档