中学英語808712 views
LaTeX957300 views
高校国語785655 views
世界の国560595 views
小学算数1194618 views
高校倫理1433119 views
雑学1472593 views
中学数学621382 views
英語607877 views
中学理科1626207 views
Help
Tools

English

Python のスレッドを開始・終了する

スレッドを作成したら、start() で開始し、join() で終了を待ちます。また、デーモンスレッドを使えば、メインプログラムの終了時に自動的にスレッドを終了させることもできます。

start() でスレッドを開始する

start() メソッドを呼ぶと、スレッドが実行を開始します。

import threading
import time

def task():
    print("タスク開始")
    time.sleep(2)
    print("タスク終了")

thread = threading.Thread(target=task)
print("start() 前")
thread.start()  # ここでスレッドが開始
print("start() 後")  # すぐに実行される(待たない)

start() は非ブロッキングで、すぐに次の行に進みます。

join() でスレッドの終了を待つ

join() を呼ぶと、そのスレッドが終了するまでブロックします。

import threading
import time

def task():
    print("タスク開始")
    time.sleep(2)
    print("タスク終了")

thread = threading.Thread(target=task)
thread.start()
print("join() 前")
thread.join()  # スレッドが終了するまで待機
print("join() 後")  # スレッド終了後に実行される

join() のタイムアウト

join() にタイムアウトを指定できます。

import threading
import time

def long_task():
    time.sleep(10)

thread = threading.Thread(target=long_task)
thread.start()

thread.join(timeout=2)  # 最大2秒待つ

if thread.is_alive():
    print("スレッドはまだ実行中")
else:
    print("スレッドは終了した")

タイムアウトしても、スレッド自体は終了しません。単に待機を中断するだけです。

is_alive() で状態を確認する

スレッドが実行中かどうかを確認できます。

import threading
import time

def task():
    time.sleep(1)

thread = threading.Thread(target=task)

print(f"開始前: {thread.is_alive()}")  # False
thread.start()
print(f"実行中: {thread.is_alive()}")  # True
thread.join()
print(f"終了後: {thread.is_alive()}")  # False

デーモンスレッド

デーモンスレッドは、メインプログラムが終了すると自動的に終了するスレッドです。

import threading
import time

def background_task():
    while True:
        print("バックグラウンド処理中...")
        time.sleep(1)

# daemon=True でデーモンスレッドに
thread = threading.Thread(target=background_task, daemon=True)
thread.start()

time.sleep(3)
print("メイン終了")
# メイン終了と同時にデーモンスレッドも終了
通常のスレッド

メインが終了しても、スレッドが終わるまでプログラムは終了しない。

デーモンスレッド

メインが終了すると、強制的に終了される。クリーンアップは行われない。

デーモンスレッドの注意点

デーモンスレッドは強制終了されるため、ファイル書き込みなど完了を保証したい処理には向きません。

import threading
import time

def write_file():
    with open("output.txt", "w") as f:
        for i in range(10):
            f.write(f"Line {i}\n")
            time.sleep(0.5)
    print("書き込み完了")  # 実行されない可能性あり

# デーモンスレッドだと途中で終了する危険
thread = threading.Thread(target=write_file, daemon=True)
thread.start()
time.sleep(1)
print("メイン終了")

複数スレッドの開始と終了

複数スレッドを効率的に管理するパターンです。

import threading
import time

def worker(n):
    time.sleep(n * 0.5)
    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("すべて完了")

start()join() を適切に使い分けることで、スレッドのライフサイクルを制御できます。