ich wollte mein Programm auf mehrere Prozessoren parallel ausführen. Wie ich bereits gelernt habe, brauche ich dafür Multiprozessing, weil Threads in Python das anders umsetzten wie ich es bräuchte. Nun habe ich aber in meinem Programm eine Klasse, die von Dict erbt. Dieses Wörterbuch soll nun von jedem Prozess gefüllt werden, aber leider bekomme es nicht hin, dass sie sich das Wörterbuch teilen.
Ich habe mal versucht ein Minimalbeispiel zu machen, um das Problem besser zu zeigen. Dafür habe ich eine Dict-Klasse so geschrieben, dass bei jedem Zugriff ein Zähler um eins erhöht wird. Ich bräuchte also folgendes Programm, nur mit Multitasking
Code: Alles auswählen
class QDataDict(dict):
def __init__(self, key="zugriffe"):
self.anzahl_zugriffe = key
super().__init__({key: 0})
def __getitem__(self, key):
if key != self.anzahl_zugriffe:
self[self.anzahl_zugriffe] += 1
return super().__getitem__(key)
def __setitem__(self, key, value):
if key != self.anzahl_zugriffe:
self[self.anzahl_zugriffe] += 1
super().__setitem__(key, value)
q_data = QDataDict()
q_data["test_1"] = 1
q_data["test_2"] = 2
q_data["test_3"] = 3
q_data["test_4"] = 4
print(f'Test_2: {q_data["test_2"]}')
print(f'Anzahl Zugriffe: {q_data["zugriffe"]}')
print(q_data)
Code: Alles auswählen
Test_2: 2
Anzahl Zugriffe: 5
{'zugriffe': 5, 'test_1': 1, 'test_2': 2, 'test_3': 3, 'test_4': 4}
Code: Alles auswählen
from multiprocessing import Process, Manager
def main(q_data, key, value):
q_data[key] = value
if __name__ == '__main__':
with Manager() as manager:
q_data = manager.dict()
p1 = Process(target=main, args=(q_data, "test_1", 1,))
p2 = Process(target=main, args=(q_data, "test_2", 2,))
p1.start()
p2.start()
p1.join()
p2.join()
print(q_data)
Kann mir jemand damit helfen?
Schon einmal vielen Dank!