2016-04-08 10 views
0

Wenn ein Objekt, das kopiert wird (mithilfe der Funktion depecopy aus der Kopierbibliothek von Python 2.7), nach Thread A gleichzeitig von Thread B geändert wird, was wird erwartet?Verhalten von deepcopy beim Ändern des zu kopierenden Objekts

EDIT: Das Objekt, das geändert werden soll, ist ein Wörterbuch, und die Änderung wäre die Entfernung eines einzelnen Schlüssels von ihm. In meinem Fall wäre das Kopieren des alten oder des neuen Wörterbuchs in Ordnung - ich wollte nur versichern, dass seltsamere unbestimmte Zustände nicht passieren würden.

Antwort

3

Code wie wird nicht nur den Interpreter brechen, weil sie eine GIL (Global Interpreter Lock) in Python gesetzt haben. So haben Sie Ihr kopiertes Objekt immer noch in einem unbestimmten Zustand, aber dank der GIL ist jedes der darin enthaltenen Unterobjekte selbst ein konsistentes und vollständiges Python-Objekt. Welche Unterobjekte im kopierten Zustand landen, ist jedoch nur eine Frage des Zufalls.

Wenn, wie Sie sagen, der andere Thread einen einzelnen Wörterbuchwert ändert, und es nicht wichtig ist, wo Ihre Kopie mit dem alten oder neuen Wert endet, besteht überhaupt keine Gefahr: Python gewährleistet die Integrität von das Wörterbuchobjekt in jedem Fall.

Wenn Sie mehrere mögliche gleichzeitige Änderungen an einem komplexen Objekt haben, verwenden Sie ein Handbuch lock, um sicherzustellen, dass ein Zustand, den Sie "sehen", als der Status der Kopie sein wird.

+1

"Schlechter Code wie dies ist, warum sie eine GIL in Python setzen müssen" - nein, es gibt eine GIL, weil der Interpreter selbst alle Arten von Thread-unsicherem Design hat. – user2357112

+0

ja - du hast Recht. aber es bringt jemanden dazu, das GIL zu erweitern, um Funktionen atomar zu machen, wie sie es in Javascript sind. Ich sollte es trotzdem anders formulieren. – jsbueno

+0

was meinst du mit 'unbestimmter Zustand'? – bsam

Verwandte Themen