Pythonのthreadingモジュールは、スレッドベースの並列処理を可能にします。この記事では、特にjoin()メソッドとそのタイムアウトパラメータに焦点を当てます。
スレッドの結合
PythonのthreadingモジュールのThreadクラスにはjoin()メソッドがあります。このメソッドは、スレッドが終了するまで待機します。つまり、join()を呼び出したスレッド(通常はメインスレッド)は、join()が呼び出されたスレッドが終了するまでブロックされます。
import threading
import time
def threadFoo():
for i in range(5):
print("foo" + str(i))
time.sleep(1)
if __name__ == "__main__":
thread = threading.Thread(target=threadFoo, name='thread1',daemon=True)
thread.start()
thread.join()
print("---end---")
上記のコードでは、threadFoo関数を別スレッドで実行し、そのスレッドが終了するまでメインスレッドをブロックしています。
タイムアウト付きのスレッド結合
join()メソッドはオプションのtimeoutパラメータも受け取ります。このパラメータは、ターゲットスレッドが終了するまで待機する時間を秒単位で指定します。タイムアウトが発生し、ターゲットスレッドがまだ終了していない場合、join()メソッドは戻ります。
import threading
import time
def threadFoo():
for i in range(5):
print("foo" + str(i))
time.sleep(1)
if __name__ == "__main__":
thread = threading.Thread(target=threadFoo, name='thread1',daemon=True)
thread.start()
thread.join(timeout=2)
print("---end---")
time.sleep(5)
上記のコードでは、thread.join(timeout=2)により、メインスレッドはターゲットスレッドが終了するか、2秒が経過するまでブロックされます。
まとめ
Pythonのthreadingモジュールは、スレッドの結合とタイムアウトを制御する強力なツールを提供します。これにより、複数のスレッドを効果的に管理し、同期的な処理を書くことが可能になります。