我有一个django Web服务器和一个用户输入信息的表单。每次表单信息发生变化时,我都会更新数据库中的模型,在某个特定的时刻,当某个东西验证时,我会在用户单击下一个之前,在celene中创建一个长时间运行的任务来获取结果。
我正在使用Django Celery和RabbitMQ作为代理,我的问题是,在任务仍未完成的情况下,什么是最合适的方法来锁定Django中的响应线程,直到任务处于状态。成功的是,我尝试使用AsyncResult.get方法,但它只是锁定线程很长一段时间,然后给我结果。IE这不是即时的,有人知道如何解决这个问题吗?
您可以等待结果为ready()
。
from time import sleep
result = some_task.apply_async(args=myargs)
while not result.ready():
sleep(0.5)
result_output = result.get()
看起来还有一个wait()
,所以你可以直接使用它。下面的代码基本上应该和上面的代码做同样的事情。
result = some_task.apply_async(args=myargs)
result_output = result.wait(timeout=None, interval=0.5)
实现这一点的一种方法是让结果在redis中等待,并使用一些独特的值(如会话id)使用阻塞弹出操作来获取它们,注意它的超时功能。