複数のスレッドがデータを入れることができるキューが必要です。複数のスレッドがそこから読み取ることができます。
Pythonには少なくともQueue.Queueとcollections.dequeの2つのキュークラスがあり、前者は後者を内部的に使用しているようです。どちらもドキュメントではスレッドセーフであると主張しています。
ただし、キューのドキュメントにも次のように記載されています。
collections.dequeは、ロックを必要としない高速のアトミックなappend()およびpopleft()操作を備えた、無制限のキューの代替実装です。
私はまったく理解していないと思います:これは、結局、dequeが完全にスレッドセーフではないことを意味しますか?
もしそうなら、私は2つのクラスの違いを完全に理解していないかもしれません。Queueがブロッキング機能を追加していることがわかります。一方で、オペレーター内のサポートなど、いくつかの必要な機能が失われます。
内部の両端キューオブジェクトに直接アクセスするのは、
Queue()。dequeのx
スレッドセーフ?
また、dequeがすでにスレッドセーフであるのに、なぜQueueはその操作にミューテックスを使用するのですか?
deque
は、同じスレッドで繰り返し処理を行っているときにadd / deleteを実行すると発生します。このエラーが発生しない唯一の理由Queue
は、Queue
反復をサポートしていないことです。
RuntimeError: deque mutated during iteration
取得できるのはdeque
、いくつかのスレッド間で共有され、ロックされていないことです...