プログラムをより効率的に動作させるためには、スレッド処理を理解し活用することが重要です。
Pythonではマルチスレッドプログラミングが可能で、複数のタスクを同時に処理することができます。
やすひら
Pythonのスレッド処理を紹介します
この記事でわかること
- スレッドとは
- Pythonのスレッド処理
目次
スレッドとは
スレッドとは、プロセス内で実行される処理単位のことです。
プログラムは1つのプロセスで順次処理を進めますが、スレッドを使用することで、複数の処理を同時に処理することができます。
重い処理や待機時間が発生する場合でも、他の処理が並行して実行できます。
スレッド処理
Pythonでは、標準ライブラリのthreadingモジュールを使用してスレッド処理を実行できます。
スレッド処理
threading.Threadクラスを使用してスレッドを作成します。
ソースコード
import threading
def task():
print("タスクが実行されました")
# スレッドの作成
thread = threading.Thread(target=task)
# スレッドの開始
thread.start()
# メインスレッドが終了するまで待機
thread.join()
コマンド実行例
$ python3 -B python-thread.py
タスクが実行されました
複数スレッドの実行
複数のスレッドを同時に実行することもできます。
ソースコード
import threading
import time
def task(name, seconds):
print(f"{name}が開始されました")
time.sleep(seconds)
print(f"{name}が終了しました")
# スレッドを複数作成
threads = []
for i in range(5):
thread = threading.Thread(target=task, args=(f"タスク{i}", i+1))
threads.append(thread)
thread.start()
# 全スレッドが終了するまで待機
for thread in threads:
thread.join()
print("全タスクが終了しました")
コマンド実行例
$ python3 -B python-thread-multi.py
タスク0が開始されました
タスク1が開始されました
タスク2が開始されました
タスク3が開始されました
タスク4が開始されました
タスク0が終了しました
タスク1が終了しました
タスク2が終了しました
タスク3が終了しました
タスク4が終了しました
全タスクが終了しました
スレッドの同期
複数のスレッドが同時に同じリソースにアクセスすると、データ競合が発生する可能性があります。
PythonではLockでリソースのロックを行い、複数のスレッドによるデータアクセス競合を防止します。
ソースコード
import threading
lock = threading.Lock()
shared_resource = 0
def task():
global shared_resource
with lock:
for _ in range(100000):
shared_resource += 1
threads = []
for _ in range(2):
thread = threading.Thread(target=task)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print(f"最終的な共有リソースの値: {shared_resource}")
コマンド実行例
$ python3 -B python-thread-data-lock.py
最終的な共有リソースの値: 200000
2つのスレッドが同じリソースにアクセスしますが、with lock:でロックをかけているため、データの競合が防止されます。
まとめ
Pythonのスレッド処理を紹介しました。
Pythonのスレッド処理は
- 並行処理できるスレッドを作成できる
- threadingでスレッドを実装できる
- startでスレッドを開始する
- joinでスレッド終了を待ち合わせる
スレッド処理を使うことで、プログラムの処理を並行して実行し、効率的な処理が可能になります。
Pythonでは、threading使ってスレッドを作成し、複数のタスクを並行して実行できます。
スレッド処理を理解して、効率的なアプリケーションを作成していきましょう。