Ich arbeite an einer Django App. Ich habe einen API-Endpunkt, der bei Bedarf eine Funktion ausführen muss, die einige Male wiederholt werden muss (bis eine bestimmte Bedingung erfüllt ist). Wie ich mit ihm jetzt zu tun habe ist -Django - führe alle x Sekunden eine Funktion aus
def shut_down(request):
# Do some stuff
while True:
result = some_fn()
if result:
break
time.sleep(2)
return True
Während ich weiß, dass dies ein schrecklicher Ansatz ist und dass ich nicht für 2 Sekunden blockiert, kann ich nicht herausfinden, wie um es zu bekommen .
Dies funktioniert, nach einer Wartezeit von 4 Sekunden. Aber ich möchte etwas, das die Schleife im Hintergrund läuft, und stoppt, sobald some_fn True zurückgibt. (Außerdem ist es sicher, dass some_fn wird Wahr zurück)
EDIT -
Lesen Oz123 Antwort gab mir eine Idee, die zu funktionieren scheint. Hier ist, was ich tat -
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)
Dies macht den Job für mich. Es ist einfach, aber ich weiß nicht, wie effizient Multithreading in Verbindung mit Django ist.
Wenn jemand auf Fallstricke hinweisen kann, wird Kritik geschätzt.
Sie können Sellerie dafür verwenden. Sie können Handbuch hier finden: https://realpython.com/blog/python/asynchronous-tasks-with-django-and-sellery/#periodic-tasks – neverwalkaloner
@newalkaloner klingt genau, was ich brauche. Werde es versuchen, danke. :) – Zeokav
Wie von @newalkaloner erwähnt, können Sie Sellerie verwenden, können Sie periodische Aufgabe mit Zeitplan einrichten, überprüfen Sie das Dokument ist sehr flexibel http://docs.selleryproject.org/en/latest/userguide/periodic-tasks.html Werfen Sie einen Blick auf Crontab Modul. –