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

Python
この記事は約3分で読めます。

みなさん、プログラムを制作していて、ここの処理を周期的に呼び出したいなぁって思うようなことないですか?

私は普段組み込みシステムの開発を行っているので、WindowsアプリやLinuxアプリ・Pythonアプリの制作を使用していて、あーここ周期処理にできたら簡単なんだけどなーって思ったりよくします。

シリアルやEthernetを使った通信系のアプリをプログラミングするときは特に思います。

Timerとは

ですので、今回は周期処理を可能とするTimer機能を紹介します。

今回使用するTimerは周期的にコールバック関数を呼び出ししてくれるものとなり、Threadの機能を使用しますので、メインのプロセスの処理に影響与えず使用できます。

threading ライブラリ を使用しますので、追加でライブラリ・モジュールをインストールする必要がありません。

サンプルコード

はい。ではいつも通りまずはコード全体を記載します。

import time
import threading
from logging import NullHandler

streamstop = False
tm = NullHandler

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()

def main_func( ):
    global tm
    tm = threading.Timer( 1 , tm_callback )
    tm.start()

    while True:
        try:
            pass
        except KeyboardInterrupt:
            print("stop")
            streamstop = True
            tm.cancel()
            tm = NullHandler
            break
    

if __name__ == '__main__':
	result = main_func()

実行結果

ではこのプログラムを実行してみます。

以下の結果から、約1秒周期で呼ばれているのがお分かりいただけると思います。

WindowsでかつPythonでこの処理を行っていることとおそらくタイマの停止や再起動等の処理で、50ms程度ずつ遅延していますが、Windows上で作成するアプリとしてはシビアなことをしない限りは大きな問題にはならないと思います。

続いてはプログラムの解説ですが、解説は次ページにて記載します。

コメント

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