Pracuję nad aplikacją Django. Mam punkt końcowy interfejsu API, który na żądanie musi wykonać funkcję, która musi zostać powtórzona kilka razy (aż do spełnienia określonego warunku). Jak mam do czynienia z tym teraz jest -Django - uruchom funkcję co x sekund
def shut_down(request):
# Do some stuff
while True:
result = some_fn()
if result:
break
time.sleep(2)
return True
Choć wiem, że to jest straszne podejście i że nie powinno być zablokowanie przez 2 sekundy, nie mogę dowiedzieć się, jak poruszać się po nim .
Działa to po powiedzeniu 4 sekund oczekiwania. Ale chciałbym coś, co utrzymuje pętlę w tle, i zatrzymaj się, gdy some_fn zwróci True. (Jest także pewne, że some_fn zwróci True)
EDIT -
Czytanie odpowiedzi Oz123 dało mi pomysł, który wydaje się działać. Oto co zrobiłem -
def shut_down(params):
# Do some stuff
# Offload the blocking job to a new thread
t = threading.Thread(target=some_fn, args=(id,), kwargs={})
t.setDaemon(True)
t.start()
return True
def some_fn(id):
while True:
# Do the job, get result in res
# If the job is done, return. Or sleep the thread for 2 seconds before trying again.
if res:
return
else:
time.sleep(2)
To nie praca dla mnie. To proste, ale nie wiem, jak wydajna wielowątkowość jest w połączeniu z Django.
Jeśli ktoś może wskazać na pułapki tego, krytyka jest doceniana.
Możesz użyć do tego selera. Możesz znaleźć instrukcję tutaj: https://realpython.com/blog/python/asynchronous-tasks-with-django-and-celery/#periodic-tasks – neverwalkaloner
@ Oncewalkaloner brzmi jak dokładnie to, czego potrzebuję. Spróbuję go użyć, dzięki. :) – Zeokav
Jak wspomniano przez @neverwalkaloner można użyć selera, można skonfigurować okresowe zadanie z harmonogramem, sprawdź, czy dokument jest bardzo elastyczny http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html popatrz na moduł crontab. –