python 周期処理を行う方法[Timer の使い方 コールバック関数]

Python
この記事は約3分で読めます。
スポンサーリンク

Timer使い方解説

今回のタイマーは標準ライブラリである、threading ライブラリを使用して行います。

タイマーを起動してコールバックを受け取る流れは以下です。

①タイマのインスタンスを生成する。(この時に時間を指定します。)

②タイマーを起動する。

時間が経過すると、①で指定した関数を呼び出ししてくれますので、タイマを止めて、行いたい処理を実行します。

残念ながら勝手に再起動はしてくれないようなので、再度時間を計測したい場合は①と②を再度実施します。

具体的な処理は以下です。

タイマの起動方法解説

まず、 threading.Timer で、コールバック関数時間を設定してインスタンスを取得します。

ここでは、第1引数に1秒 第2引数で tm_callback 関数を設定しています。

時間の指定は、秒単位で指定することになります。

ここで以下のような疑問に思うか方もいるかもしれません。

あれ、秒単位でないとタイマー使えないの??

安心してください。この時間指定は、Float型を指定しますので、1msから時間を設定できます。

1msのタイマを起動したい場合は、1/1000秒ですので、0.001を指定します。

tm = threading.Timer( 1 , tm_callback )   # 周期時間を1秒で指定してコールバックを設定
tm.start()                                # タイマを起動する

そして、以下のようにコールバック関数を用意します。

コールバックの中身は以下のように、 tm.cancel でタイマを一度停止します。

タイマを停止したら、使い終わったtmをdelで一旦解放します。

※このインスタンスを一旦解放処理は、私の環境では終了イベント受けてもタイマが止まらないことがありましたので、タイマが止まらなかったらやってみてください。

そして、最後の3行で再起動をして 、周期的にこの関数がよばれるようにしています。

def tm_callback():
    global tm
    tm.cancel()
    del tm
    tm = NullHandler
    
    print( time.time() )
    if streamstop == False:
        tm = threading.Timer( 1 , tm_callback )
        tm.start()

はい。いかがだったでしょうか?

多少の誤差や遅延はあるもののざっくり指定時間で動作していますしかつ最短1msでの処理も行えるので、ちょっと周期で処理したいなぁと思った時には簡単でとても便利だと思います。

ぜひみなさんも周期処理したいぁって思った時は、試してみてください。

Pythonについて勉強したい人は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

みんなのPython 第4版 [ 柴田 淳 ]
価格:2970円(税込、送料無料) (2022/7/6時点)


コメント

タイトルとURLをコピーしました