Pythonで定期的にタスクを実行する方法はいくつかありますが、その中でもsleeptimerはよく使われます。しかし、これらの方法はそれぞれ異なる特性と利点があります。

sleepによる待機

sleepは指定した時間だけプログラムを一時停止します。しかし、この方法では、他の処理の時間が加算され、実質的に指定した時間通りに実行されない可能性があります。

import time
for i in range(1000):
    print(time.time())
    time.sleep(1)

threadingでタイマーを使う

threadingモジュールのTimerクラスを使うと、指定した時間後に関数を実行することができます。しかし、スレッドを作成してタイマーを設定するまでの時間分だけ、定周期が伸びてしまう可能性があります。

import time
import threading

def scheduler():
    t = threading.Timer(1, scheduler)
    t.start()
    print(time.time())

t = threading.Thread(target=scheduler)
t.start()
time.sleep(1000)

処理時間を考慮してthreadingとsleepを使う

別のスレッドを立てて実行することを考えると、途中の処理時間を考慮して、その分の補正を行うことが有効です。

import time
import threading

def worker():
    print(time.time())
    time.sleep(8)

def scheduler(interval, f, wait=True):
    base_time = time.time()
    next_time = 0
    while True:
        t = threading.Thread(target=f)
        t.start()
        if wait:
            t.join()
        next_time = ((base_time - time.time()) % interval) or interval
        time.sleep(next_time)

scheduler(1, worker, False)

以上のように、Pythonで定期的にタスクを実行する方法はいくつかありますが、それぞれに利点と欠点があります。適切な方法を選択することで、より効率的なプログラムを作成することができます。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です