いろは2990632 views
小学算数1196005 views
MathPython492451 views
中学理科1627080 views
英語608783 views
小学理科717612 views
高校倫理1434270 views
高校物理158466 views
高校生物550093 views
りんご195339 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 など)が必要になることを覚えておきましょう。