Pythonで定期的にタスクを実行する方法はいくつかありますが、その中でもsleep
とtimer
はよく使われます。しかし、これらの方法はそれぞれ異なる特性と利点があります。
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で定期的にタスクを実行する方法はいくつかありますが、それぞれに利点と欠点があります。適切な方法を選択することで、より効率的なプログラムを作成することができます。