Как очистить / перезаписать все данные в общей памяти? - PullRequest
0 голосов
/ 09 ноября 2019

Мне нужно перезаписать все ранее записанные данные в общей памяти (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}"с первой записи

Как перезаписать все ранее записанные данные в общей памяти

1 Ответ

1 голос
/ 09 ноября 2019

проще всего было бы сначала создать байтовый массив с нулевым заполнением, например:

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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...