这取决于你想如何准确地安排你的工作。有几个机制:
This blog有使用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))
这仍然会漂移,只是没有那么多...
嗯,为什么一个greenlet循环不休,调用回调和睡眠,还不够吗? –
我在gunicorn中使用它,所以它是web服务器,我不知道该怎么做。我只有处理函数,但我可能会在那之前插入该代码。这看起来有点不好,因为如果我需要10个定时器,我需要10个回调。这甚至会和gunicorn一起工作吗? – bradojevic