ある関数を一定の速度で、たとえば 1 秒間に 6 回実行したいと思います。Pythonでこれを行う最良の方法は何ですか?
ループの最後で単純な time.sleep() を試してみましたが、もちろん、信頼できる時計のようには機能しません。CPU 使用率に何らかの変化があり、突然「タイマー」が開始位置から大きくずれてしまいました。
ある関数を一定の速度で、たとえば 1 秒間に 6 回実行したいと思います。Pythonでこれを行う最良の方法は何ですか?
ループの最後で単純な time.sleep() を試してみましたが、もちろん、信頼できる時計のようには機能しません。CPU 使用率に何らかの変化があり、突然「タイマー」が開始位置から大きくずれてしまいました。
試してみてくださいcelery
。例:
from celery.task import tasks, PeriodicTask
from datetime import timedelta
class Every100MillisecondsTask(PeriodicTask):
run_every = timedelta(milliseconds=100)
def run(self, **kwargs):
logger = self.get_logger(**kwargs)
logger.info("Execute 10 times per second")
テストされていませんが、動作するはずです。値を変更して、必要な解像度を得ることができます。timedelta にはマイクロ秒単位で渡すこともできます。実際にこの回答から適応。
このようなものがうまくいくはずです。固定の開始時間に固定されているため、ドリフトしません。
import time
def repeat(func, interval):
start = time.time()
tick = interval / 50.0
count = 0
while True:
if time.time() >= start + interval * count:
func()
count += 1
time.sleep(tick)
関数をfoo
毎秒 6 回実行する場合は、次のようにします。
def foo():
print '.',
repeat(foo, 1.0 / 6)
編集: セロリを使用する mccrustin の回答が気に入っていますが、自分でロールする必要がある場合は、この回答が機能するはずです。