LoginSignup
73
91

More than 5 years have passed since last update.

Python3で一定間隔で処理を行う

Last updated at Posted at 2016-12-19

「一定間隔で」処理をしたいときにどうしたらいいのかちょっと迷ったのでメモ。

センサの読み出しとか、だいたい1秒間隔で呼び出せてればいい場合は、以下のような感じで書かれてることが多い気がする。

import time

def task():
    print(time.time())

while True:
    task()
    time.sleep(1)

ただこれだと、

実行間隔 = task()の実行時間 + time.sleep()の呼び出しにかかる時間 + 1秒

になってしまう。
これだと精度云々の前に「一定間隔」ではない。

ロボットの制御とか音ゲー的なもので、正確に(と言ってもtimer.sleep()の精度と同じくOSのスケジューラの精度以上にはならないのだが)に100msec間隔で関数を呼び出したい。どうしたらいいのか。

システムコールとシグナルを使って、OSに一定間隔で呼び出してもらうことにした。

import signal
import time

def task(arg1, arg2):
    print(time.time())

signal.signal(signal.SIGALRM, task)
signal.setitimer(signal.ITIMER_REAL, 0.1, 0.1)

while True:
    time.sleep(1)

引数の説明は以下のような感じ。
実行間隔にはfloatも設定できる。

signal.signal(signal.SIGALRM, 呼び出したい関数)
signal.setitimer(signal.ITIMER_REAL, 1回目の実行までの時間, 2回目以降の実行間隔)

実行結果。

$ python3 signal_timer.py 
1482167643.537612
1482167643.633588
1482167643.733585
1482167643.833546
1482167643.933578
1482167644.033563
1482167644.133434
1482167644.233593
1482167644.333625
1482167644.433611
1482167644.532706
1482167644.633626
1482167644.732813
1482167644.833607
1482167644.933651
1482167645.033594
1482167645.133631
1482167645.233608
1482167645.333617
1482167645.43365
1482167645.533664
1482167645.633506
1482167645.733653
1482167645.83349
1482167645.933611
1482167646.033654
1482167646.133675
1482167646.233464
1482167646.333358
1482167646.433514
1482167646.533638
1482167646.63348
1482167646.733628
1482167646.833232
1482167646.933508
1482167647.033419
1482167647.133616
1482167647.233618
1482167647.333291
1482167647.433455
1482167647.533664
1482167647.633571
1482167647.733662
1482167647.833642
1482167647.93337
73
91
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
91