Bir Django uygulaması üzerinde çalışıyorum. İstenirse, birkaç kez tekrarlanması gereken bir işlev yürütmesi gereken bir API son noktaya sahibim (belirli bir koşul doğru olana kadar). Şu anda onunla uğraşıyorum nasıl -Django - her x saniyede bir işlev çalıştırın
def shut_down(request):
# Do some stuff
while True:
result = some_fn()
if result:
break
time.sleep(2)
return True
Bu korkunç bir yaklaşım olduğunu biliyoruz iken ve ben 2 saniye engelleme gerektiğini, bunun etrafında nasıl çözemiyorum .
Bu, 4 saniye bekledikten sonra çalışır. Ancak, döngüyü arka planda çalıştıran bir şeyden hoşlanırım ve some_fn True değerini döndürdüğünde durur.
Okuma Oz123 cevabı bana iş gibi görünüyor bir fikir verdi -
DÜZENLEME (Ayrıca, doğru dönecektir some_fn kesindir). İşte ne yaptım -
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)
Bu benim için işi yapar. Bu basit ama çok iş parçacığının Django ile ne kadar verimli olduğunu bilmiyorum.
Eğer herhangi bir kişi bunun tuzaklarına işaret edebilirse, eleştiri takdir edilir.
Bunun için kereviz kullanabilirsiniz. El kitabını burada bulabilirsiniz: https://realpython.com/blog/python/asynchronous-tasks-with-django-and-celery/#periodic-tasks – neverwalkaloner
@neverwalkaloner tam olarak neye ihtiyacım var gibi geliyor. Kullanmayı deneyeceğim, teşekkürler. :) – Zeokav
@neverwalkaloner tarafından bahsettiğiniz gibi kereviz kullanabilirsiniz, programlı periyodik görevi ayarlayabilir, dokümanın çok esnek olduğunu kontrol edebilirsiniz http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html crontab modülüne bir göz atın. –