我正在开发 Django 应用程序。我有一个 API 端点,如果请求,它必须执行必须重复几次的功能(直到某个条件为真)。我现在的处理方式是——
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 结合的效率如何。
如果有人能指出其中的缺陷,不胜感激。
原文由 Zeokav 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于许多小项目来说, celery 有点矫枉过正。对于那些你可以使用 schedule 的项目,它非常容易使用。
使用此库,您可以使任何函数定期执行任务:
该示例以阻塞方式运行,但是如果您查看常见问题解答,您会发现您也可以在并行线程中运行任务,这样您就不会阻塞,并且一旦不再需要就删除任务:
这是在类方法中使用的示例: