So synchronisieren Sie den python-Listen?
Ich habe verschiedene threads und nach der Verarbeitung Daten in eine gemeinsame Liste. Gibt es etwas, gebaut in python eine Liste oder ein numpy-array zugegriffen werden, indem Sie nur einen einzigen thread. Zweitens, wenn es nicht ist, was ist eine elegante Möglichkeit, es zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
threading
bietetLock
Objekte, wenn Sie brauchen, um einen gesamten kritischen Abschnitt, oder dieQueue
Modul bietet eine Warteschlange, die threadsicher ist.Laut Thread-Synchronisations-Mechanismen in Python, liest ein einzelnes Element aus einer Liste und ändern einer Liste sind garantiert atomar sind. Wenn dies richtig ist (obwohl es scheint teilweise im Widerspruch zu der von der Existenz des Queue-Modul), dann, wenn Ihr code wird alle von der form:
Und alles in
mylist
erfolgt durch.append()
, dann ist dein code ist schon threadsicher sind. Wenn Sie nicht Vertrauen, dass ein Dokument auf die Gäste, verwenden Sie ein Warteschlange.Warteschlange, die synchronisation für Sie, und hat eine bessere API alslist
für parallele Programme - vor allem gibt es Ihnen die Möglichkeit, die Sperrung auf unbestimmte Zeit oder für eine Auszeit, wartet.pop()
zu arbeiten, wenn Sie nicht haben, etwas anderes, was der thread könnte sich in der Zwischenzeit.Für numpy-arrays, und im Allgemeinen jedem Fall, wo Sie brauchen mehr als eine producer/consumer-Warteschlange verwenden Sie eine
Lock
oderRLock
austhreading
- diese Umsetzung der Kontext-manager-Protokoll, so mit Ihnen ist ganz einfach:Und python wird gewährleistet, dass das lock wird freigegeben, sobald Sie fallen aus dem Ende des
with
block - auch in kniffligen Fällen, wie wenn Sie etwas tun, wirft eine exception.Schließlich ist zu berücksichtigen, ob
multiprocessing
ist eine bessere Passform für Ihre Anwendung, alsthreading
- threads in Python nicht garantiert, dass tatsächlich gleichzeitig ausgeführt werden, und in CPython nur, wenn der Tropfen auf C-level-code.multiprocessing
bekommt um dieses Thema, aber kann einige zusätzliche overhead - wenn Sie nicht bereits haben, sollten Sie die Dokumentation Lesen, um zu bestimmen, welche passt Ihre Bedürfnisse besser.mylist.pop(0)
auch atmoic?with mylock:
Erinnerung. Imho RLocks verwendet, so sind oft die klarste idiom zum Schutz der kritischen Abschnitte, die in der objektorientierten Programmierung.mylist.pop(0)
wäre, atomic, wennmylist.pop()
ist (die ich auch nicht beantworten kann, definitiv, das ist der Grund, warum ich auch noch andere Synchronisations-Methoden; es können auch änderungen in Python-Implementierungen). Insbesondere alle C-Quellcode in CPython kann werden bewacht von der GIL (hat aber die option, es zu veröffentlichen).pop
(wahrscheinlich) entweder die Veröffentlichungen der GIL oder nicht, unabhängig von Ihrem argument.Wie über die standard-Bibliothek Warteschlange?