To zależy od tego, jak dokładnie chcesz zaplanować swoją pracę. Istnieje kilka mechanizmów:
This blog ma fajny trik na korzystanie gevent.spawn_later
stworzyć 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)
Albo oczywiście można po prostu spać w pętli, która jest prawdopodobnie bardziej czytelne:
def run_regularly(self, function, interval, *args, **kwargs):
while True:
gevent.sleep(interval)
function(*args, **kwargs)
Jednak oba te elementy będą ulegać dryfowaniu z upływem czasu, szczególnie jeśli wykonanie tej funkcji wymaga czasu w stosunku do interwału. można wyrównać poprzez regulację odstępu uśpienia przez czas potrzebny do wykonywania funkcji:
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))
ten będzie nadal dryfować, po prostu nie tak dużo ...
Hmm, dlaczego jest Greenlet pętli bez końca, nazywając wywołania zwrotnego i spania, nie wystarczy? –
Używam tego w gunicorn, więc jest to serwer WWW i nie wiem jak to zrobić. Po prostu mam funkcję obsługi, ale prawdopodobnie mógłbym wstawić ten kod wcześniej. Wygląda to dość źle, ponieważ jeśli potrzebuję 10 timerów, potrzebuję 10 wywołań zwrotnych. Czy to będzie działać z gunicornem? – bradojevic