1. ホーム
  2. パイソン

[解決済み】Queue.Queueとcollections.dequeの比較

2022-04-06 19:05:17

質問

私は、複数のスレッドがものを置くことができ、複数のスレッドが読み取ることができるキューを必要としています。

Pythonには少なくとも2つのキュークラスがあります。 Queue.Queuecollections.deque 前者は後者を内部的に使用しているように見えます。どちらもドキュメントではスレッドセーフであると主張しています。

しかし、Queueのドキュメントにはこうも書かれている。

collections.dequeは 非限定キューの実装 高速なアトミックアペンド()と popleft() 操作 を使用しない ロックが必要です。

というのは、よく理解できないのですが。これはdequeが完全なスレッドセーフではないということでしょうか?

もしそうなら、私はこの2つのクラスの違いを十分に理解していないのかもしれません。Queueがブロッキング機能を追加していることはわかります。一方で、インオペレータのサポートなど、いくつかのdequeの機能が失われています。

内部のdequeオブジェクトに直接アクセスするのは

x in Queue().deque

スレッドセーフ?

また deque はスレッドセーフなのに、Queue はなぜ mutex を使っているのですか?

解決方法は?

Queue.Queuecollections.deque は異なる目的で使用されます。Queue.Queue は異なるスレッドがキューに入れられたメッセージやデータを使って通信できるようにするためのものであり、一方 collections.deque は、単にデータ構造として意図されています。そのため Queue.Queue のようなメソッドを持っています。 put_nowait() , get_nowait() および join() 一方 collections.deque はしない。 Queue.Queue はコレクションとして使用されることを意図していません。 in 演算子を使用します。

要するに、複数のスレッドがあり、それらのスレッドがロックなしで通信できるようにしたい場合、次のようなものが必要だということです。 Queue.Queue データ構造としてキューやダブルエンド・キューが必要な場合は、以下のようにします。 collections.deque .

最後に Queue.Queue は火遊びですからね、そんなことはしたくないでしょう。