Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

センサの読み出しとか、だいたい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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした