Pythonで一定周期のループを実装する方法について説明します。この記事では、Pythonのtime
モジュールとthreading
モジュールを使用して、一定の間隔で処理を繰り返す方法を紹介します。
time.sleep
による待機
最も単純な方法は、time.sleep
関数を使用して一定時間待つことです。しかし、この方法では、1周するごとに他の処理の時間が加算され、実質的には1秒周期にならない可能性があります。
import time
for i in range(1000):
print(time.time())
time.sleep(1)
threading
でタイマーを使う
次に、threading
モジュールを使用して別スレッドを立てて実行する方法を考えます。この方法では、定周期の最初で次の定周期用タイマーを定義し、以降で通常の処理を行います。
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)
この方法を使うと、多少のばらつきはあるが、平均1秒で実行できるように見えます。
シグナルハンドラを利用する
最後に、シグナルハンドラを利用する方法を紹介します。この方法はUnix系環境限定です。
import signal
import time
def scheduler(arg1, args2):
print(time.time())
signal.signal(signal.SIGALRM, scheduler)
signal.setitimer(signal.ITIMER_REAL, 1, 1)
time.sleep(1000)
この方法を使うと、明らかに良い精度で1秒で定周期実行できていることがわかります。
以上、Pythonで一定周期のループを実装する方法について説明しました。これらの方法を適切に選択し、使用することで、Pythonでの一定周期のループ処理を効果的に実装することができます。.