Pythonのqueueモジュールについての詳細解説

Python

Pythonのqueueモジュールは、データの挿入や取り出しを、指定する順番で可能にするライブラリです。
queueモジュールには、取り出す順番の異なる3種類のクラスがまとめられています。

queueモジュールはPythonの標準ライブラリに含まれているので、installは不要です。
ただし、Python2系とPython3系では、ソースコードでの表記が下記のように異なるので注意しましょう。

  • Python2系=大文字の「Queue」
  • Python3系=小文字の「queue」

FIFOキュー(先入れ先出し)

FIFOキューは「First In First Out」の略で、キューとも呼ばれます。「先入れ先出し」の構造で、最初に入れたデータを最初に取り出す方法です。

【書式】

queue.Queue()

つまり、入れた順番通りの順番で、データを取り出します。

わかりやすくいうと、スーパーのレジやラーメン屋の行列のように、入ってその順番で出て行くイメージです。

【コード例】

# 必要なライブラリのインポート
from queue import Queue

# FIFOキューの作成
queue = Queue()

# キューにデータを挿入する。挿入するデータは「0,1,2,3,4」
for i in range(5):
    queue.put(i)

# キューからデータがなくなるまで取り出しを行う
while not queue.empty():
    print(queue.get())

【出力結果】

0
1
2
3
4

put()で、キューに要素が追加されます。
get()で、最初の要素から抽出されます。

LIFOキュー(後入れ先出し)

LIFOキューは後入れ先出しの構造で、最後に入れたデータから順番に取り出していく方法です。
LIFOは「Last In First Out」の略で、スタックとも呼ばれます。

【書式】

queue.LifoQueue()

入れた順番とは逆の順番で、データを取り出します。
わかりやすくいうと、満員電車やエレベーターの乗降がスタックにあたります。

【コード例】

# 必要なライブラリのインポート
from queue import LifoQueue

# LIFOキューの作成
queue = LifoQueue()

# キューにデータを挿入する。挿入するデータは「0,1,2,3,4」
for i in range(5):
    queue.put(i)

# キューからデータがなくなるまで取り出しを行う
while not queue.empty():
    print(queue.get())

【出力結果】

4
3
2
1
0

put()で、キューに要素が追加されます。
get()で、最新の要素から抽出されます。

優先順位付きキュー「PriorityQueue」

PriorityQueueはデータの要素の値に基づいて取り出す順番を決める方法です。
要素の値で並べ替えることをソートといい、低い値の要素から取り出されます。

【書式】

queue.PriorityQueue()

pythonには、heapqとqueue.PriorityQueueという、2種類の優先度付きキューがあります。
マルチスレッドの場合は、ここで紹介するqueue.PriorityQueueを使用します。

【コード例】

# 必要なライブラリのインポート
from queue import PriorityQueue

# 優先順位付きキューの作成
queue = PriorityQueue()

# キューにデータを挿入する。挿入するデータは「7,1,5」の順
queue.put(7)
queue.put(1)
queue.put(5)

# キューからデータがなくなるまで取り出しを行う
while not queue.empty():
    print(queue.get())

【出力結果】

1
5
7

FIFOキューの順番なら、出力される順番は「715」
LIFOキューの順番なら、出力される順番は「517」
になるはずですが、値の小さい要素から取り出されるので「157」となります。

queueモジュールで挿入や抽出を行うメソッド

queueモジュールでは、データの挿入や取り出しを実行するために以下のメソッドを用います。

上に出てきたコードの中でも実際に出てきたものを説明していきます。

キューへの挿入は「put」

【書式】

queue.put()

キューからの取り出しは「get」

【書式】

queue.get()

キューが空かチェックする「empty」

【書式】

queue.empty()

キューが満杯かチェックする「full」

【書式】

queue.full

コメント

タイトルとURLをコピーしました