【问题标题】:Django celery retrieve task status using AjaxDjango celery 使用 Ajax 检索任务状态
【发布时间】:2012-07-09 10:29:03
【问题描述】:

我正在使用 celery 2.5.3 和 django celery - 2.5.5。我使用 mysql 作为代理。

这是一个场景,当用户请求我在从另一个站点获取数据的工作人员中排队工作时。这可能需要几分钟,具体取决于数据的大小。作业开始后,我们必须显示加载器图像。当工作人员完成下载数据(将是 html 格式)时,我必须用检索到的数据替换加载器图像。

我们使用 celery 的原因是有时脚本需要超过 30 秒才能完成并超时。

目前我打算使用ajax调用来检查job的状态,这个函数将在固定的时间间隔使用。

我经历了几个问题,这就是我想出的

要启动工人,我正在使用此代码

def testCelery(request):
   result=testadd.apply_async()
   return HttpResponse(str(result.task_id))

这会将task_id返回给客户端并使用ajax我将向服务器发送请求以检查作业是否已完成

def getStat(request,task_id):
      res = AsyncResult(task_id)
      s=res.ready()
      if s==True:
         return HttpResponse(str(res.get()))
      else:
         return HttpResponse(str(s))

我不确定这是否是正确的方法,或者它在实时场景中的表现如何。

请指教。

编辑:使用 djcelery 视图检查状态

好的,我已经按照 bruno 的建议修改了我的代码,现在它看起来像

from djcelery import views as celery_views
def getStat(request,task_id):
    return celery_views.is_task_successful(request, task_id)

而且它似乎正在工作。并且仍然使用带有 task_id 的 ajax 调用来检索状态。

【问题讨论】:

    标签: python python-2.7 celery django-celery


    【解决方案1】:

    Django-celery 已经提供了您正在寻找的视图和 url - views.task_statusviews.is_task_successful 都将 task_id 作为参数并返回一个带有(resp.)完整状态的 json 响应(包括异常和回溯,如果任务失败)或只是一个布尔标志。

    例如,将以下内容添加到urls.py

    urlpatterns += patterns('djcelery.views',
        url(r'^task/status/(?P<task_id>.+)/$', 'task_status',
        name='task-status')
    )
    

    【讨论】:

    • 谢谢布鲁诺...它似乎正在工作。是否可以使用 ajax 函数来检查状态...或者我应该使用其他逻辑
    • 鉴于您的要求,ajax 是最明显和最明智的选择。毫不奇怪 django-celery 已经提供了这个功能......
    猜你喜欢
    • 2011-10-21
    • 2012-02-11
    • 1970-01-01
    • 2011-06-19
    • 2012-02-20
    • 2017-06-16
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多