4

N秒ごとに発生させたい作業単位があります。私が単純化したものを使用する場合

minute = 60
while True:
    doSomeWork()
    time.sleep(minute)

かかる時間にもよりますdoSomeWork()が、実際のループ期間は 1 分プラスその時間になります。doSomeWork() にかかる時間が決定論的でない場合、作業の期間はさらに予測不可能になります。

私がやりたいことは、このようなものです

minute = 60
start = time.process_time() #? i can imagine using this, but maybe there's something better?
while True:
    doSomeWork()
    start += minute
    sleep_until(start) #? this is the function I'm in search of

(私はpython 3.3を使用しています)

アップデート:

Linux/OSX では、シグナルから itimer を使用して、探していることを実行できます。

import signal
import datetime

def tick(_, __):
    # doSomeWork()
    print(datetime.datetime.now())

signal.setitimer(signal.ITIMER_REAL, 60, 60)
signal.signal(signal.SIGALRM, tick)

while True:
    signal.pause()

python3.4用に開発されているチューリップのものもこれを簡単にするようです。

4

1 に答える 1

5

sleep_until(timestamp)は基本的にtime.sleep(timestamp - time.time())

あなたのコードは実際には問題ありません (負の時間をスリープに渡さないようにすることは、それでも良い考えです):

import time

minute = 60
next_time = time.time()
while True:
    doSomeWork()
    next_time += minute
    sleep_time = next_time - time.time()
    if sleep_time > 0:
        time.sleep(sleep_time)

 

個人的には、60 秒間隔のタイムスタンプのジェネレーターを作成して使用します。

import time
import itertools

minute = 60

for next_time in itertools.count(time.time() + minute, minute):
    doSomeWork()
    sleep_time = next_time - time.time()
    if sleep_time > 0:
        time.sleep(sleep_time)
于 2013-03-17T00:04:56.403 に答える