Es hängt davon ab, wie genau wollen Sie Ihren Job eingeplant werden. Es gibt ein paar Mechanismen:
This blog hat einen ordentlichen Trick gevent.spawn_later
für die Verwendung eines Timer zu erstellen:
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)
Oder natürlich kann man einfach in einer Schleife schlafen, die wahrscheinlich besser lesbar ist:
def run_regularly(self, function, interval, *args, **kwargs):
while True:
gevent.sleep(interval)
function(*args, **kwargs)
jedoch beide von ihnen werden im Laufe der Zeit driften, vor allem, wenn Ihre Funktion Zeit in Anspruch nimmt, um das Intervall relativ zu vervollständigen. Sie können die Funktion auszuführen, nimmt durch die Zeit, durch Einstellen der Ruhezeit kompensieren:
Dies wird noch
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))
treiben, nur nicht ganz so viel ...
Hmm, warum ein greenlet Looping endlos, ruft einen Rückruf und Schlafen, nicht genug: Es kann auch in mehrere Abschnitte für verschiedene Zwecke zu teilen einen bestimmten Zeitraum genutzt werden? –
Ich benutze dies in Gunicorn, so ist es Webserver, und ich weiß nicht, wie das geht. Ich habe nur Handler-Funktion, aber ich könnte diesen Code wahrscheinlich vorher einfügen. Es sieht irgendwie schlecht aus, wenn ich 10 Timer brauche, brauche ich 10 Callbacks. Wird das überhaupt mit Gunicorn funktionieren? – bradojevic