キュー(Queue)を使おう
キュー(Queue)とは、日本語で待ち行列といい、コンピューターで用いられるデータ構造のひとつです。
Pythonのキューには、先入れ先出しキュー(First In First Out/FIFO)、後入れ先出しキュー(Last In First Out/LIFO)、優先順位付けキューがあります。
なお、LIFOはスタックともいいます。
今回は、先入れ先出しキューと後入れ先出しキューのプログラムを作ってみましょう。
キューをインポートする
まず、キューライブラリーをインポートします。
import queue
キューオブジェクトを作成する
先入れ先出しキューと後入れ先出しキューのオブジェクトの作成は、以下のようになります。
■ 先入れ先出しキュー
オブジェクト名 = queue.Queue(maxsize=0)
■ 後入れ先出しキュー
オブジェクト名 = queue.LifoQueue(maxsize=0)
maxsizeオプションはキューに入れる要素数を表す整数です。
デフォルトは0で、無限に要素を入れることができます。
キューに値を入れる
キューに値を入れるには、put()メソッドを使います。
オブジェクト名.put(item, block=True, timeout=None)
値 | 内容 |
item | キューに入れる値 |
block | True(デフォルト)/False。ブロックの有無。 |
timeout | 正の整数。タイムアウトする時間。デフォルトはNone |
blockオプションとtimeoutオプションは、組み合わせによって意味が変わってきます。
block | timeout | 内容 |
True | None | キューに空きができるまでブロックする(デフォルト) |
True | 正の整数 | キューに空きができるまで最大で指定した秒数ブロックする。タイムアウトしたら例外Fullを送出する |
False | - | 空きがない場合は、直ちに例外Fullを送出する。timeoutオプションは無視される |
キューから値を取り出す
キューから値を取り出すには、get()メソッドを使います。
オブジェクト名.get(block=True, timeout=None)
値 | 内容 |
block | True(デフォルト)/False。ブロックの有無。 |
timeout | 正の整数。タイムアウトする時間。デフォルトはNone |
blockオプションとtimeoutオプションは、組み合わせによって意味が変わってきます。
block | timeout | 内容 |
True | None | 値が取り出せるまでブロックする(デフォルト) |
True | 正の整数 | 値が取り出せるまで最大で指定した秒数ブロックする。タイムアウトしたら例外Emptyを送出する |
False | - | 値が取り出せない場合は、直ちに例外Emptyを送出する。timeoutオプションは無視される |
キューを使ったプログラム
キューを使ったプログラムは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
### インポート import time import tkinter import threading import queue ### 関数 def func(queue, pos_x, pos_y): ### キューが空ではない間ループ while not queue.empty(): ### キャンバス書き込み id = canvas.create_text(pos_x, pos_y, text=queue.get(), font=(None,48)) ### 待ち時間 time.sleep(1) ### キャンバス初期化 canvas.delete(id) ### キャンバス作成 canvas = tkinter.Canvas(master=None, width=420, height=200) ### キャンバス表示 canvas.pack() ### キュー作成 queue1 = queue.Queue() queue2 = queue.LifoQueue() ### 0~9の値を作成 for num in range(10): ### キューに値を設定 queue1.put(num) queue2.put(num) ### スレッド作成 thread1 = threading.Thread(target=func, args=(queue1,140,100), daemon=True) thread2 = threading.Thread(target=func, args=(queue2,280,100), daemon=True) ### スレッド開始 thread1.start() thread2.start() ### イベントループ canvas.mainloop() |
プログラムを実行すると、左側が先入れ先出しキュー、右側が後入れ先出しキューの値が表示されます。