それはあなたがあなたの仕事をどれだけ正確にスケジュールしたいかによります。いくつかのメカニズムがあります:
このブログgevent.spawn_later
には、タイマーを作成するために使用するための巧妙なトリックがあります。
def schedule(delay, func, *args, **kw_args):
gevent.spawn_later(0, func, *args, **kw_args)
gevent.spawn_later(delay, schedule, delay, func, *args, **kw_args)
またはもちろん、おそらくもっと読みやすいループで単に眠ることができます:
def run_regularly(self, function, interval, *args, **kwargs):
while True:
gevent.sleep(interval)
function(*args, **kwargs)
ただし、特に関数が間隔に対して完了するのに時間がかかる場合は、これらの両方が時間の経過とともにドリフトします。関数の実行にかかる時間でスリープ間隔を調整することで、補正できます。
def run_regularly(self, function, interval, *args, **kwargs):
while True:
before = time.time()
function(*args, **kwargs)
duration = time.time() - before
if duration < interval:
gevent.sleep(interval-duration)
else:
warning("function %s duration exceeded %f interval (took %f)" % (
function.__name__, interval, duration))
これはまだドリフトしますが、それほど多くはありません...