我正在研究一個Django應用程序。我有一個API端點,如果請求,必須執行必須重複幾次(直到某個條件成立)的函數。我如何處理它現在的問題是 -Django - 每x秒運行一個函數
def shut_down(request):
# Do some stuff
while True:
result = some_fn()
if result:
break
time.sleep(2)
return True
雖然我知道這是一個可怕的辦法,我不應該阻止2秒,我不能想出如何繞過它。
這個工程,說了4秒鐘後。但是我想要讓循環在後臺運行,並且在some_fn返回True時停止。 (也可以肯定some_fn會返回True)
編輯 -
閱讀Oz123的迴應給了我一個似乎工作的想法。以下是我所做的 -
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)
這對我來說沒有工作。這很簡單,但我不知道多線程與Django結合的效率。
如果有人可以指出這個缺陷,批評是讚賞。
您可以使用芹菜爲此。你可以在這裏找到手冊:https://realpython.com/blog/python/asynchronous-tasks-with-django-and-celery/#periodic-tasks – neverwalkaloner
@neverwalkaloner聽起來像我所需要的。將嘗試使用它,謝謝。 :) – Zeokav
正如@neverwalkaloner提到的那樣,您可以使用芹菜,您可以按計劃設置定期任務,查看文檔非常靈活http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html看看它的crontab模塊。 –