Python入門 (3) -マルチスレッド
Pythonでのマルチスレッドの実行手順をまとめました。
・Python 3.7
前回
1. Pythonのスレッドの実行
Pytyonのスレッドの実行手順は、次のとおりです。
(1) スレッドで実行する関数の準備。
(2) 関数を実行するスレッドの準備。
(3) スレッドの開始。
使用例は、次のとおりです。
import threading
import time
# スレッドで実行する関数の準備
def worker1():
print('start worker1')
time.sleep(5)
print('end worker1')
# スレッドで実行する関数の準備
def worker2(x, y):
print('start worker2')
time.sleep(5)
print('end worker2', x, y)
# 関数を実行するスレッドの準備
t1 = threading.Thread(target=worker1)
t2 = threading.Thread(target=worker2, args=(10, 20))
# スレッドの開始
t1.start()
t2.start()
結果は、次のとおりです。
start worker1
start worker2
〜 5秒後 〜
end worker1
end worker2 10 20
◎ threading.Thread
Pythonのスレッドは、threading.Threadで生成します。
コンストラクタは、次のとおりです。
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
コンストラクタ。
・group : Noneのみ。将来拡張用。
・target : run()で呼び出すオブジェクト。
・name : スレッド名。デフォルトは"Thread- N"。
・args : targetを呼び出す時の引数タプル。
・kwargs : target を呼び出す時の引数辞書。
・daemon : デーモンスレッドかどうか。
メソッドとプロパティは、次のとおりです。
・start() : スレッドの処理を開始。
・run() : スレッドの処理。
・join(timeout=None) : スレッドが終了するまで待機。
・timeout : タイムアウト秒。
・name : スレッド名。
・is_alive() : スレッドが処理中かどうか。
・daemon : デーモンスレッドかどうか。
2. Pythonのスレッド間通信
キューによるPythonのスレッド間通信の手順は、次のとおりです。
(1) スレッドで実行する関数の準備。
(2) キューの準備。
(3) 関数を実行するスレッドの準備し、キューを引数として渡す。
(4) キューを介してスレッド間通信を行う。
使用例は、次のとおりです。
import threading
import queue
import time
# スレッドで実行する関数の準備
def worker1(q):
print('start worker1')
q.put(10) # キューに要素を追加
time.sleep(5) # 5秒スリープ
q.put(20) # キューに要素を追加
print('end worker1')
# スレッドで実行する関数の準備
def worker2(q):
print('start worker2')
print(q.get()) # キューから要素を取得
print(q.get()) # キューから要素を取得
print('end worker2')
# キューの準備
q = queue.Queue()
# 関数を実行するスレッドの準備
t1 = threading.Thread(target=worker1, args=(q,))
t2 = threading.Thread(target=worker2, args=(q,))
# スレッドの開始
t1.start()
t2.start()
結果は、次のとおりです。
start worker1
start worker2
10
〜 5秒後 〜
end worker1
20
end worker2
◎ queue.Queue
Pythonのキューは、queue.Queueで生成します。
コンストラクタは、次のとおりです。
class queue.Queue(maxsize=0)
FIFOキューのコンストラクタ。
・maxsize : 最大サイズ。
class queue.LifoQueue(maxsize=0)
LIFOキューのコンストラクタ。
・maxsize : 最大サイズ。
class queue.PriorityQueue(maxsize=0)
優先順位付きキューのコンストラクタ。
・maxsize : 最大サイズ。
メソッドは、次のとおりです。
・qsize() : キューのサイズ。
・empty() : キューが空かどうか。
・full() : キューが一杯かどうか。
・put(item, block=True, timeout=None) : キューへの要素の追加。block=Trueで一杯の場合は利用可能になるまでブロック。一杯でタイムアウト時はFullを返す。
・put_nowait(item) : put(item, False) と同じ。
・get(block=True, timeout=None) : キューの要素の取得。block=Trueで空の場合は利用可能になるまでブロック。空でタイムアウト時はEmptyを返す。
・get_nowait() : get(False)と同じ。
・task_done() : 過去にキューに入れられたタスクが完了した事を示す。
・join() : キューの全要素が取り出されて処理されるまでブロック。