okpy

Pythonエンジニア兼テックリーダーが、多くのプロジェクトとチーム運営から得た実践的な知識を共有するブログです。

Python threading ライブラリ活用法

Python threading ライブラリ完全ガイド

Python 標準ライブラリの threading は、マルチスレッドプログラミングをサポートするためのツールを提供します。本記事では、threading の主要な機能とその活用方法について詳しく解説します。

1. threading ライブラリの概要

  • threading は、Python でマルチスレッドを利用するための標準ライブラリです。
  • スレッドを使用することで、並行処理が可能になります。
  • GIL (Global Interpreter Lock) の影響で CPU バウンドタスクでは効果が限定的ですが、I/O バウンドタスクには有効です。

インストール方法

threadingPython の標準ライブラリなので、追加のインストールは不要です。

import threading

2. 主な機能と使用例

(1) 基本的なスレッドの作成(Thread

import threading
import time

def worker():
    print("スレッド開始")
    time.sleep(2)
    print("スレッド終了")

thread = threading.Thread(target=worker)
thread.start()
thread.join()  # メインスレッドでスレッドの完了を待つ

使用例: バックグラウンドで処理を実行し、メインプログラムをブロックせずに処理できます。


(2) スレッドのロック(Lock

import threading

lock = threading.Lock()
count = 0

def increment():
    global count
    with lock:
        for _ in range(100000):
            count += 1

threads = [threading.Thread(target=increment) for _ in range(5)]
for t in threads:
    t.start()
for t in threads:
    t.join()

print("最終カウント:", count)

使用例: 複数のスレッドが同じデータにアクセスする際の競合を防ぐことができます。


(3) イベントを使用したスレッドの制御(Event

import threading
import time

event = threading.Event()

def worker():
    print("待機中...")
    event.wait()
    print("処理開始!")

thread = threading.Thread(target=worker)
thread.start()
time.sleep(2)
event.set()  # スレッドを解放

使用例: スレッドの開始を外部イベントで制御する場合に活用できます。


(4) タスクのスケジューリング(Timer

import threading

def delayed_task():
    print("3秒後に実行されました!")

threading.Timer(3, delayed_task).start()

使用例: 一定時間後に特定のタスクを実行する場合に便利です。


(5) 複数のタスクを管理(ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
import time

def worker(n):
    time.sleep(1)
    return f"完了: {n}"

with ThreadPoolExecutor(max_workers=3) as executor:
    results = executor.map(worker, range(5))
    for result in results:
        print(result)

使用例: スレッドプールを利用して複数のタスクを並列処理できます。


(6) デーモンスレッドの作成(daemon

import threading
import time

def daemon_task():
    while True:
        print("デーモンスレッド動作中...")
        time.sleep(1)

daemon_thread = threading.Thread(target=daemon_task, daemon=True)
daemon_thread.start()
time.sleep(3)  # メインスレッドが終了すると、デーモンスレッドも終了

使用例: バックグラウンドで動作するスレッドを作成し、メインスレッドの終了時に自動終了させる。


(7) 条件変数を用いたスレッド同期(Condition

import threading

condition = threading.Condition()
shared_data = []

def producer():
    with condition:
        shared_data.append("データ")
        print("データを追加しました")
        condition.notify()

def consumer():
    with condition:
        condition.wait()
        print("データを取得しました:", shared_data.pop())

threading.Thread(target=consumer).start()
threading.Thread(target=producer).start()

使用例: スレッド間でデータの受け渡しを制御する。


(8) セマフォを用いたスレッド制限(Semaphore

import threading
import time

semaphore = threading.Semaphore(2)

def worker(n):
    with semaphore:
        print(f"スレッド {n} 開始")
        time.sleep(2)
        print(f"スレッド {n} 終了")

threads = [threading.Thread(target=worker, args=(i,)) for i in range(5)]
for t in threads:
    t.start()
for t in threads:
    t.join()

使用例: 同時に実行できるスレッド数を制限する。


(9) バリアを用いたスレッド同期(Barrier

import threading
import time

barrier = threading.Barrier(3)

def worker(n):
    print(f"スレッド {n} 待機中...")
    barrier.wait()
    print(f"スレッド {n} 実行開始")

threads = [threading.Thread(target=worker, args=(i,)) for i in range(3)]
for t in threads:
    t.start()
for t in threads:
    t.join()

使用例: 複数のスレッドが同時に開始されるように同期する。


(10) スレッドの識別子と名前を取得(get_ident, current_thread

import threading

def worker():
    print("スレッド ID:", threading.get_ident())
    print("スレッド名:", threading.current_thread().name)

thread = threading.Thread(target=worker, name="MyThread")
thread.start()
thread.join()

使用例: スレッドのデバッグ時に ID や名前を取得する。


3. threading の主な機能

機能 説明
Thread スレッドの作成と実行
Lock 排他制御のためのロック機構
Event スレッドの同期と制御
Timer 指定時間後にタスクを実行
ThreadPoolExecutor スレッドプールを使用して並列処理を管理

まとめ

Pythonthreading ライブラリを活用すると、並行処理を簡単に実装できます。I/O バウンドのタスクやイベント駆動型のシステムで特に効果を発揮します。適切なスレッド管理を行い、効率的なマルチスレッド処理を実現しましょう! 🚀