Python のスレッドモジュールのタイマークラス
スレッド化は、並列処理を実現するために複数のスレッドを同時に実行する手法です。Python では、threading
モジュールを使用してスレッドを実装できます。現在、スレッド
モジュールにはクラスタイマー
があり、これを使用して、x
時間後にアクションを実行したり、コードを実行したりできます。この記事では、このクラスをどのように使用できるかを確認し、例を使用して理解を深めます。無限タイマーを作成します。
Python の threading.Timer
クラス
Timer
クラスは Thread
クラスのサブクラスであり、一定時間後にコードを実行するために使用できます。これは、interval
と function
の 2つの引数を受け入れます。interval
はコードが実行される秒数を指し、function
は必要な時間が経過したときに呼び出されるコールバック関数です。このクラスには、start()
と cancel()
という 2つの重要な関数があります。start()
メソッドを使用してタイマーを開始し、cancel()
メソッドを使用してタイマーをキャンセルします。
タイマーオブジェクトはデフォルトでは起動しません。それらを起動するには、start()
メソッドを呼び出す必要があります。また、実行中のタイマーを停止するには、cancel()
メソッドを使用できます。
理論が完成したので、このクラスを実際に使用して無限タイマーを作成する方法を理解しましょう。同じことについては、次のコードを参照してください。
from time import sleep
from threading import Timer
from datetime import datetime
class MyInfiniteTimer:
"""
A Thread that executes infinitely
"""
def __init__(self, t, hFunction):
self.t = t
self.hFunction = hFunction
self.thread = Timer(self.t, self.handle_function)
def handle_function(self):
self.hFunction()
self.thread = Timer(self.t, self.handle_function)
self.thread.start()
def start(self):
self.thread = Timer(self.t, self.handle_function)
self.thread.start()
def cancel(self):
self.thread.cancel()
def print_current_datetime():
print(datetime.today())
t = MyInfiniteTimer(1, print_current_datetime)
t.start()
sleep(5)
t.cancel()
sleep(5)
t.start()
sleep(5)
t.cancel()
出力:
2021-10-31 05:51:20.754663
2021-10-31 05:51:21.755083
2021-10-31 05:51:22.755459
2021-10-31 05:51:23.755838
2021-10-31 05:51:24.756172
2021-10-31 05:51:30.764942
2021-10-31 05:51:31.765281
2021-10-31 05:51:32.765605
2021-10-31 05:51:33.766017
2021-10-31 05:51:34.766357
ご覧のとおり、MyInfiniteTimer
クラスは Timer
クラスを使用しています。t
と hFunction
の 2つの引数を受け入れます。これらは、秒数と Timer
オブジェクトのコールバック関数を参照します。MyInfiniteTimer
クラスオブジェクトが作成されると、クラスのコンストラクターは新しいタイマーオブジェクトを作成しますが、開始しません。タイマーは、MyInfiniteTimer
クラスの start()
メソッドを使用して起動できます。また、stop()
メソッドを使用すると、タイマーを停止できます。現在のタイマーが終了すると、ハンドラーまたは handle_function()
は、前のタイマーと同じ構成で新しいタイマーを作成し、それを開始します。
MyInfiniteTimer
クラスの動作を紹介するために、最初に 29
行に新しい MyInfiniteTimer
クラスオブジェクトを作成し、次に start()
メソッドを呼び出しました。次に、5
秒待つか、タイマーを 5
秒実行します。次に、タイマーを停止し、再び 5
秒待ちました。最後に、最後の 2つのプロセスを繰り返した後、プログラムは終了しました。