Queue---同期キュークラス


モジュールは、エントリがフェッチされる順序だけを区別する3つのタイプのキューを実現します.FIFOキューで、先に追加したタスクを先にフェッチします.LIFOキューでは、最近追加されたエントリが先にフェッチされます(スタックのように動作します).優先順位キューでは、エントリはソート(heapqモジュールを使用)され、最小値のエントリが最初に返されます.
内部では、この3つのタイプのキューがロックを使用して競合スレッドをブロックします.しかしながら、スレッドの再入力処理には設計されていない.
さらに、モジュールは、小さな機能が交換中に追加の保障を提供する「簡単な」FIFOキュータイプ、SimpleQueueを実現しています.
class queue.Queue(maxsize=0) Constructor for a FIFO queue. maxsize is an integer that sets the upperbound limit on the number of items that can be placed in the queue. Insertion will block once this size has been reached, until queue items are consumed. If maxsize is less than or equal to zero, the queue size is infinite.
class queue.LifoQueue(maxsize=0)LIFOキュー構築関数.maxsizeは整数で、キューに入れる項目数の上限を設定します.このサイズに達すると、挿入操作はキューにブロックされたアイテムを消費します.maxsizeがゼロ以下の場合、キューサイズは無限大です.
class queue.LifoQueue(maxsize=0)LIFOキュー構築関数.maxsizeは整数で、キューに入れる項目数の上限を設定します.このサイズに達すると、挿入操作はキューにブロックされたアイテムを消費します.maxsizeがゼロ以下の場合、キューサイズは無限大です.
class queue.PriorityQueue(maxsize=0)優先キュー構築関数.maxsizeは整数で、キューに入れる項目数の上限を設定します.このサイズに達すると、挿入操作はキューにブロックされたアイテムを消費します.maxsizeがゼロ以下の場合、キューサイズは無限大です.
最小値は先に取り出される(最小値エントリはsorted(list(entries)[0]で返されるエントリである).エントリの典型的なパターンは、(priority_number,data)という形式のメタグループです.
data要素に比較性がない場合、データはクラスにパッケージされ、データ値は無視され、優先度の数字だけが比較されます.
from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)

class queue.SimpleQueue無境界FIFOキュー構築関数.単純なキューでは、タスク追跡などの高度な機能が欠けています.
exception queue.Emptyが空のQueueオブジェクトに対して、ブロックされていないget()(or get_nowait())を呼び出したときに発生する異常.
exception queue.フルのQueueオブジェクトに対して、ブロックされていないput()(or put_nowait())を呼び出すと発生する異常.
Queueオブジェクト
Queue.qsize()は、キューのほぼサイズを返します.なお、qsize()>0は、後続のget()がブロックされないことを保証せず、qsize()Queue.Empty()キューが空の場合はTrue、そうでない場合はFalseを返します.empty()がTrueを返す場合、後続の呼び出しのput()がブロックされないことは保証されません.同様に、empty()がFalseを返す場合、後続の呼び出しのget()がブロックされないことも保証されません.
Queue.フル()キューがフルの場合はTrueを返します.そうでない場合はFalseを返します.full()がTrueを返すと、後続の呼び出しのget()がブロックされないことが保証されません.同様に、full()がFalseを返しても、後続の呼び出しのput()がブロックされないことは保証されません.
Queue.put(item,block=True,timeout=None)はitemをキューに入れます.オプションのパラメータblockがtrueでtimeoutがNone(デフォルト)の場合、必要に応じて空きスロットがあるまでブロックします.timeoutが正数の場合、timeout秒までブロックされます.この時間に空きスロットがない場合、Full例外が発生します.逆に(blockはfalse)、空きスロットがすぐに利用できる場合はitemをキューに入れます.そうしないとFull異常が発生します(この場合、timeoutは無視されます).
Queue.put_nowait(item)はput(item,False)に相当する.
Queue.get(block=True,timeout=None)は、キューからアイテムを削除して返します.オプションパラメータblockがtrueでtimeoutがNone(デフォルト)の場合、必要に応じてプロジェクトにブロックします.timeoutが正数の場合、timeout秒までブロックされ、その間にプロジェクトが得られない場合、Empty異常が発生します.逆に(blockはfalse)、1つのプロジェクトがすぐに入手できる場合は、1つのプロジェクトを返します.そうしないと、Empty異常が発生します(この場合、timeoutは無視されます).
POSIXシステム3.0以前、およびすべてのバージョンのWindowsシステムにおいて、blockがtrueであり、timeoutがNoneである場合、この操作はベースロックの無停止待ちに入る.これは、特にSIGINTがKeyboardInterrupt例外をトリガーしないことを意味します.
Queue.get_nowait()はget(False)に相当します.
キューにキューされたタスクが保護されているかどうかを追跡する消費者スレッドの完全な処理をサポートする2つの方法が提供される.
Queue.task_done()は、前に並んだタスクが完了したことを示します.キューの消費者スレッドによって使用されます.各get()は、タスクを取得し、task_を呼び出すために使用されます.done()は、タスクの処理が完了したことをキューに伝えます.
join()が現在ブロックされている場合、すべてのエントリが処理されると、ブロックが解除されます(各put()がキューに入るエントリtask_を意味します).done()はすべて受信されました.
キューに格納されたアイテムの数より多く呼び出された場合、ValueError例外が発生します.
Queue.join()キューにブロックされたすべての要素が受信され、処理されます.
キューにエントリが追加されると、未完了タスクのカウントが増加します.消費者スレッドがtask_を呼び出すたびにdone()は、このエントリが回収され、そのエントリのすべての作業が完了すると、未完了カウントが減少することを示します.未完了カウントがゼロに下がるとjoin()ブロックが解除される.
キューに並んだタスクが完了するのを待つ方法の例:
def worker():
    while True:
        item = q.get()
        if item is None:
            break
        do_work(item)
        q.task_done()

q = queue.Queue()
threads = []
for i in range(num_worker_threads):
    t = threading.Thread(target=worker)
    t.start()
    threads.append(t)

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

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

# stop workers
for i in range(num_worker_threads):
    q.put(None)
for t in threads:
    t.join()

SimpleQueueオブジェクト
SimpleQueue.qsize()は、キューのほぼサイズを返します.なお、qsize()>0は、後続のget()がブロックされないことを保証しない.
SimpleQueue.Empty()キューが空の場合はTrue、そうでない場合はFalseを返します.empty()がFalseを返す場合、後続の呼び出しのget()がブロックされないことは保証されません.
SimpleQueue.put(item,block=True,timeout=None)はitemをキューに入れます.このメソッドはブロックされず、常に成功します(メモリ割り当ての失敗などの潜在的な低レベルエラーを除きます).オプションパラメータblockとtimeoutは、Queue.put()の互換性を維持するために提供されるだけで、その値は無視されます.
CPython implementation detail: This method has a C implementation which is reentrant. That is, a put() or get() call can be interrupted by another put() call in the same thread without deadlocking or corrupting internal state inside the queue. This makes it appropriate for use in destructors such as del methods or weakref callbacks.
SimpleQueue.put_Nowait(item)はput(item)に相当する、Queueのみを保持する.put_nowait()互換性で提供されます.
SimpleQueue.get(block=True,timeout=None)は、キューからアイテムを削除して返します.オプションパラメータblockがtrueでtimeoutがNone(デフォルト)の場合、必要に応じてプロジェクトにブロックします.timeoutが正数の場合、timeout秒までブロックされ、その間にプロジェクトが得られない場合、Empty異常が発生します.逆に(blockはfalse)、1つのプロジェクトがすぐに入手できる場合は、1つのプロジェクトを返します.そうしないと、Empty異常が発生します(この場合、timeoutは無視されます).
SimpleQueue.get_nowait()はget(False)に相当します.
class multiprocessingを参照してください.Queueは、マルチスレッドではなく、マルチプロセスコンテキスト用のキュークラスです.
collections.deque is an alternative implementation of unbounded queues with fast atomic append() and popleft() operations that do not require locking.