我正在研究一个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模块。 –