Dipende da quanto accuratamente si desidera pianificare il proprio lavoro. Ci sono un paio di meccanismi:
This blog ha un trucco per l'utilizzo di gevent.spawn_later
per creare un timer:
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)
O, naturalmente, semplicemente si può dormire in un ciclo che è probabilmente più leggibile:
def run_regularly(self, function, interval, *args, **kwargs):
while True:
gevent.sleep(interval)
function(*args, **kwargs)
Tuttavia entrambi si spostano nel tempo, in particolare se la tua funzione richiede del tempo per il completamento rispetto all'intervallo. È possibile compensare regolando l'intervallo di sonno dal momento in cui la funzione di necessario per eseguire:
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))
Questo sarà ancora alla deriva, ma non abbastanza tanto ...
Hmm, perché è un greenlet un loop senza fine, chiamando un callback e dormire, non basta? –
Lo uso in gunicorn, quindi è un server web e non so come farlo. Ho solo la funzione di gestore, ma probabilmente potrei inserire quel codice prima di quello. Sembra un pò brutto farlo perché se ho bisogno di 10 timer, ho bisogno di 10 callback. Funzionerà anche con Gunicorn? – bradojevic