2

ある関数を一定の速度で、たとえば 1 秒間に 6 回実行したいと思います。Pythonでこれを行う最良の方法は何ですか?

ループの最後で単純な time.sleep() を試してみましたが、もちろん、信頼できる時計のようには機能しません。CPU 使用率に何らかの変化があり、突然「タイマー」が開始位置から大きくずれてしまいました。

4

2 に答える 2

2

試してみてください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 にはマイクロ秒単位で渡すこともできます。実際にこの回答から適応。

于 2012-12-26T17:39:04.293 に答える
0

このようなものがうまくいくはずです。固定の開始時間に固定されているため、ドリフトしません。

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 の回答が気に入っていますが、自分でロールする必要がある場合は、この回答が機能するはずです。

于 2012-12-26T17:50:52.023 に答える