django celery get() 用于获取结果表单任务
Posted
技术标签:
【中文标题】django celery get() 用于获取结果表单任务【英文标题】:django celery get() for getting the result form task 【发布时间】:2014-06-04 08:42:11 【问题描述】:我有一个对服务器的 API 调用,我正在使用 celery 进行一些处理。 celery 的输出被传回给客户端。
我用过
som = task_async_get_cached_session.delay('session_123')
print 'before'
result = som.get(timeout=1)
print 'after'
我看了celery -l INFO
,任务成功了
succeeded in 0.024465521s: data: session_123: something
但是我的客户没有得到回复,我设置了超时,现在我收到了The operation timed out. (<class 'celery.exceptions.TimeoutError'>)
当我查看日志跟踪时,只打印了before
。我的问题是,当您希望将 celery 任务生成的结果发送给客户端时,如何在没有 get()
的情况下使用 celery?
我知道get()
会将我的 API 调用转换为同步调用,但我有什么替代方法?芹菜的真正用途是什么?有没有其他方法可以将我的 API 更改为异步行为?
【问题讨论】:
【参考方案1】:使用celery.result设计一个函数来检查任务状态并得到结果。
from celery.result import AsyncResult
def get_result(my_work):
work = AsyncResult(my_work.id)
if work.ready(): # check task state: true/false
try:
result = work.get(timeout=1)
return result
except:
pass
return "Please waiting result."
【讨论】:
在这种情况下,假设我通过了 "status":"Please waiting result.", "taskId":"123"。然后客户端在另一个 API /status/taskId
获取结果。您可以使用会话或数据库为每个用户存储taskId
。那么用户就不需要自己记住这个id了。
因为消息代理可能在远程服务器上工作。 :)以上是关于django celery get() 用于获取结果表单任务的主要内容,如果未能解决你的问题,请参考以下文章
Django - Celery - supervisord 日志配置
Celery异步任务队列/周期任务+ RabbitMQ + Django
如何在任务中获取芹菜结果模型(使用 django-celery-results)
用于多个客户端的 Django + Celery + Apache mod_wsgi + Postgres + RabbitMQ 应用程序