Ich brauche eine Warteschlange, in die mehrere Threads Inhalte einfügen können und aus der mehrere Threads lesen können.
Python hat mindestens zwei Warteschlangenklassen, Queue.Queue und collection.deque, wobei die erstere anscheinend die letztere intern verwendet. Beide behaupten, in der Dokumentation threadsicher zu sein.
In den Warteschlangendokumenten heißt es jedoch auch:
collection.deque ist eine alternative Implementierung von unbegrenzten Warteschlangen mit schnellen atomaren append () - und popleft () -Operationen, für die kein Sperren erforderlich ist.
Was ich wohl nicht ganz verstehe: Bedeutet das, dass Deque doch nicht vollständig threadsicher ist?
Wenn ja, kann ich den Unterschied zwischen den beiden Klassen nicht vollständig verstehen. Ich kann sehen, dass die Warteschlange Blockierungsfunktionen hinzufügt. Auf der anderen Seite verliert es einige Deque-Funktionen wie die Unterstützung des In-Operators.
Der direkte Zugriff auf das interne Deque-Objekt ist
x in Queue (). deque
Thread-sicher?
Warum verwendet Queue einen Mutex für seine Operationen, wenn deque bereits threadsicher ist?
deque
während Sie selbst im selben Thread iterieren. Der einzige Grund, warum Sie diesen Fehler nicht erhalten können, Queue
ist, dass Queue
die Iteration nicht unterstützt wird.
RuntimeError: deque mutated during iteration
ist, was Sie bekommen könnten, ist die Verwendung einesdeque
von mehreren Threads gemeinsam genutzten und ohne Sperren ...