中学社会667106 views
小学社会308636 views
いろは2986023 views
数学講師2852771 views
高校物理158224 views
りんご192546 views
ヒストリア284143 views
MathPython491378 views
高校倫理1433119 views
LaTeX957300 views
Help
Tools

English

Python でスレッドを作成する

Python でスレッドを作成するには threading モジュールの Thread クラスを使います。関数をスレッドで実行する方法と、クラスを継承して作る方法があります。

関数をスレッドで実行する

最も基本的な方法は、Thread クラスの target 引数に実行したい関数を渡すことです。

import threading

def greet(name):
    print(f"こんにちは、{name}さん!")

# スレッドを作成
thread = threading.Thread(target=greet, args=("田中",))

# スレッドを開始
thread.start()

# スレッドの終了を待つ
thread.join()

args にはタプルで引数を渡します。引数が1つの場合は args=("田中",) のようにカンマを忘れないでください。

キーワード引数を渡す

キーワード引数は kwargs で渡します。

import threading

def greet(name, message="こんにちは"):
    print(f"{message}{name}さん!")

thread = threading.Thread(
    target=greet,
    args=("田中",),
    kwargs={"message": "おはよう"}
)
thread.start()
thread.join()

複数のスレッドを作成する

複数のスレッドを作成して並行処理を行う例です。

import threading
import time

def worker(n):
    print(f"Worker {n} 開始")
    time.sleep(1)
    print(f"Worker {n} 終了")

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

for t in threads:
    t.join()

print("すべてのワーカーが終了")

Thread クラスを継承する

より複雑な処理には、Thread クラスを継承する方法もあります。

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, name, delay):
        super().__init__()
        self.name = name
        self.delay = delay
    
    def run(self):
        print(f"{self.name} 開始")
        time.sleep(self.delay)
        print(f"{self.name} 終了")

t1 = MyThread("スレッドA", 2)
t2 = MyThread("スレッドB", 1)

t1.start()
t2.start()

t1.join()
t2.join()

run() メソッドをオーバーライドして、スレッドで実行する処理を定義します。

スレッドに名前を付ける

デバッグしやすくするために、スレッドに名前を付けられます。

import threading

def task():
    print(f"実行中: {threading.current_thread().name}")

t1 = threading.Thread(target=task, name="ダウンローダー")
t2 = threading.Thread(target=task, name="パーサー")

t1.start()
t2.start()
t1.join()
t2.join()

現在のスレッド情報を取得する

import threading

def show_info():
    current = threading.current_thread()
    print(f"名前: {current.name}")
    print(f"ID: {current.ident}")
    print(f"生存中: {current.is_alive()}")

thread = threading.Thread(target=show_info, name="InfoThread")
thread.start()
thread.join()

実行中のスレッド一覧

import threading
import time

def worker():
    time.sleep(2)

threads = [threading.Thread(target=worker) for _ in range(3)]
for t in threads:
    t.start()

# 実行中のスレッド一覧
print(f"アクティブなスレッド数: {threading.active_count()}")
for t in threading.enumerate():
    print(f"  - {t.name}")

スレッドの作成は簡単ですが、複数のスレッドがデータを共有する場合は、同期処理(Lock など)が必要になることを覚えておきましょう。