मुझे एक साझा स्मृति (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}" पहले लिखने से

साझा मेमोरी में पहले से लिखे गए सभी डेटा को कैसे अधिलेखित करें?

0
Temperosa 9 नवम्बर 2019, 12:16

1 उत्तर

सबसे बढ़िया उत्तर

सबसे आसान शून्य भरा बाइट सरणी पहले बनाना हो सकता है, जैसे कुछ:

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())
1
Sam Mason 9 नवम्बर 2019, 17:08