8.10. キュー—同期されたキュークラス—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/queue
移動先:案内検索

8.10。 列 —同期されたキュークラス

ノート

Python3では Queue モジュールの名前がqueueに変更されました。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。


ソースコード: :source: `Lib / Queue.py`



Queue モジュールは、マルチプロデューサー、マルチコンシューマーキューを実装します。 これは、情報を複数のスレッド間で安全に交換する必要があるスレッドプログラミングで特に役立ちます。 このモジュールの Queue クラスは、必要なすべてのロックセマンティクスを実装します。 Pythonでのスレッドサポートの可用性に依存します。 スレッドモジュールを参照してください。

このモジュールは、エントリが取得される順序のみが異なる3種類のキューを実装します。 FIFOキューでは、最初に追加されたタスクが最初に取得されます。 LIFOキューでは、最後に追加されたエントリが最初に取得されます(スタックのように動作します)。 優先キューを使用すると、エントリは並べ替えられたままになり( heapq モジュールを使用)、最も値の小さいエントリが最初に取得されます。

Queue モジュールは、次のクラスと例外を定義します。

class Queue.Queue(maxsize=0)
FIFOキューのコンストラクタ。 maxsize は、キューに入れることができるアイテムの数の上限を設定する整数です。 このサイズに達すると、キューアイテムが消費されるまで、挿入はブロックされます。 maxsize がゼロ以下の場合、キューサイズは無限大です。
class Queue.LifoQueue(maxsize=0)

LIFOキューのコンストラクター。 maxsize は、キューに入れることができるアイテムの数の上限を設定する整数です。 このサイズに達すると、キューアイテムが消費されるまで、挿入はブロックされます。 maxsize がゼロ以下の場合、キューサイズは無限大です。

バージョン2.6の新機能。

class Queue.PriorityQueue(maxsize=0)

優先キューのコンストラクタ。 maxsize は、キューに入れることができるアイテムの数の上限を設定する整数です。 このサイズに達すると、キューアイテムが消費されるまで、挿入はブロックされます。 maxsize がゼロ以下の場合、キューサイズは無限大です。

最も価値の低いエントリが最初に取得されます(最も価値の低いエントリは、sorted(list(entries))[0]によって返されるエントリです)。 エントリの一般的なパターンは、(priority_number, data)の形式のタプルです。

バージョン2.6の新機能。

exception Queue.Empty
空の Queue オブジェクトで非ブロッキング get()(または get_nowait())が呼び出されたときに例外が発生しました。
exception Queue.Full
いっぱいになっている Queue オブジェクトで、非ブロッキング put()(または put_nowait())が呼び出されたときに例外が発生しました。

も参照してください

collections.deque は、ロックを必要としない高速アトミックappend()およびpopleft()操作を備えた無制限キューの代替実装です。


8.10.1。 キューオブジェクト

キューオブジェクト( QueueLifoQueue 、または PriorityQueue )は、以下に説明するパブリックメソッドを提供します。

Queue.qsize()
キューのおおよそのサイズを返します。 qsize()> 0は、後続のget()がブロックされないことを保証するものではなく、qsize()
Queue.empty()
キューが空の場合はTrueを返し、それ以外の場合はFalseを返します。 empty()がTrueを返す場合、put()への後続の呼び出しがブロックされないことを保証するものではありません。 同様に、empty()がFalseを返す場合、get()への後続の呼び出しがブロックされないことを保証するものではありません。
Queue.full()
キューがいっぱいの場合はTrueを返し、それ以外の場合はFalseを返します。 full()がTrueを返す場合、get()への後続の呼び出しがブロックされないことを保証するものではありません。 同様に、full()がFalseを返す場合、put()への後続の呼び出しがブロックされないことを保証するものではありません。
Queue.put(item[, block[, timeout]])

item をキューに入れます。 オプションの引数 block がtrueで、 timeoutNone(デフォルト)の場合、空きスロットが使用可能になるまで必要に応じてブロックします。 timeout が正の数の場合、最大で timeout 秒をブロックし、その時間内に使用可能な空きスロットがない場合は Full 例外を発生させます。 それ以外の場合( block はfalse)、空きスロットがすぐに利用できる場合はアイテムをキューに入れます。それ以外の場合は、 Full 例外を発生させます( timeout は無視されます)。場合)。

バージョン2.3の新機能: timeout パラメーター。

Queue.put_nowait(item)
put(item, False)と同等です。
Queue.get([block[, timeout]])

キューからアイテムを削除して返します。 オプションの引数 block がtrueで、 timeoutNone(デフォルト)の場合、アイテムが使用可能になるまで必要に応じてブロックします。 timeout が正の数の場合、最大で timeout 秒をブロックし、その時間内に使用可能なアイテムがない場合は Empty 例外を発生させます。 それ以外の場合( block がfalse)、すぐに使用できる場合はアイテムを返します。それ以外の場合は、 Empty 例外を発生させます(その場合、 timeout は無視されます)。

バージョン2.3の新機能: timeout パラメーター。

Queue.get_nowait()
get(False)と同等です。

エンキューされたタスクがデーモンコンシューマスレッドによって完全に処理されたかどうかの追跡をサポートするために、2つの方法が提供されています。

Queue.task_done()

以前にキューに入れられたタスクが完了したことを示します。 キューコンシューマスレッドによって使用されます。 タスクのフェッチに使用される get()ごとに、 task_done()への後続の呼び出しは、タスクの処理が完了したことをキューに通知します。

join()が現在ブロックしている場合、すべてのアイテムが処理されると再開されます(つまり、 putされたすべてのアイテムに対して task_done()呼び出しが受信されました()をキューに入れます)。

キューに配置されたアイテムよりも多く呼び出された場合、ValueErrorを発生させます。

バージョン2.5の新機能。

Queue.join()

キュー内のすべてのアイテムが取得および処理されるまでブロックします。

アイテムがキューに追加されるたびに、未完了のタスクの数が増えます。 コンシューマースレッドが task_done()を呼び出して、アイテムが取得され、そのアイテムに対するすべての作業が完了したことを示すたびに、カウントが減少します。 未完了のタスクの数がゼロになると、 join()のブロックが解除されます。

バージョン2.5の新機能。

キューに入れられたタスクが完了するのを待つ方法の例:

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done