見出し画像

Python入門 (3) -マルチスレッド

npaka

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
105秒後 〜

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() : キューの全要素が取り出されて処理されるまでブロック。

次回


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!