Python のスレッドモジュールのタイマークラス

Vaibhav Vaibhav 2022年1月23日
Python のスレッドモジュールのタイマークラス

スレッド化は、並列処理を実現するために複数のスレッドを同時に実行する手法です。Python では、threading モジュールを使用してスレッドを実装できます。現在、スレッドモジュールにはクラスタイマーがあり、これを使用して、x 時間後にアクションを実行したり、コードを実行したりできます。この記事では、このクラスをどのように使用できるかを確認し、例を使用して理解を深めます。無限タイマーを作成します。

Python の threading.Timer クラス

Timer クラスは Thread クラスのサブクラスであり、一定時間後にコードを実行するために使用できます。これは、intervalfunction の 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 クラスを使用しています。thFunction の 2つの引数を受け入れます。これらは、秒数と Timer オブジェクトのコールバック関数を参照します。MyInfiniteTimer クラスオブジェクトが作成されると、クラスのコンストラクターは新しいタイマーオブジェクトを作成しますが、開始しません。タイマーは、MyInfiniteTimer クラスの start() メソッドを使用して起動できます。また、stop() メソッドを使用すると、タイマーを停止できます。現在のタイマーが終了すると、ハンドラーまたは handle_function() は、前のタイマーと同じ構成で新しいタイマーを作成し、それを開始します。

MyInfiniteTimer クラスの動作を紹介するために、最初に 29 行に新しい MyInfiniteTimer クラスオブジェクトを作成し、次に start() メソッドを呼び出しました。次に、5 秒待つか、タイマーを 5 秒実行します。次に、タイマーを停止し、再び 5 秒待ちました。最後に、最後の 2つのプロセスを繰り返した後、プログラムは終了しました。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

関連記事 - Python Threading