【问题标题】:Django-Celery progress barDjango-Celery 进度条
【发布时间】:2011-11-14 20:58:30
【问题描述】:

我用:

  1. 芹菜
  2. Django-芹菜
  3. RabbitMQ

我可以在 Django 管理页面中看到我的所有任务,但目前它只有几个状态,例如:

  • 收到
  • 重试
  • 已撤销
  • 成功
  • 开始
  • 失败
  • 待处理

这对我来说信息不足。是否可以将有关正在运行的进程的更多详细信息添加到管理页面?像进度条已完成的工作计数器等。

我知道如何使用 Celery 日志记录功能,但出于某些原因,我的 GUI 更好。

那么,是否可以将一些跟踪信息发送到 Django-Celery 管理页面?

【问题讨论】:

    标签: django django-celery


    【解决方案1】:

    这是我使用您的设置的最小进度报告 Django 后端。我还是个Django n00b,第一次玩Celery,所以这个大概可以优化一下。

    from time import sleep
    
    from celery import task, current_task
    from celery.result import AsyncResult
    
    from django.http import HttpResponse, HttpResponseRedirect
    from django.core.urlresolvers import reverse
    from django.utils import simplejson as json
    from django.conf.urls import patterns, url
    
    
    @task()
    def do_work():
        """ Get some rest, asynchronously, and update the state all the time """
        for i in range(100):
            sleep(0.1)
            current_task.update_state(state='PROGRESS',
                meta={'current': i, 'total': 100})
    
    
    def poll_state(request):
        """ A view to report the progress to the user """
        if 'job' in request.GET:
            job_id = request.GET['job']
        else:
            return HttpResponse('No job id given.')
    
        job = AsyncResult(job_id)
        data = job.result or job.state
        return HttpResponse(json.dumps(data), mimetype='application/json')
    
    
    def init_work(request):
        """ A view to start a background job and redirect to the status page """
        job = do_work.delay()
        return HttpResponseRedirect(reverse('poll_state') + '?job=' + job.id)
    
    
    urlpatterns = patterns('webapp.modules.asynctasks.progress_bar_demo',
        url(r'^init_work$', init_work),
        url(r'^poll_state$', poll_state, name="poll_state"),
    )
    

    【讨论】:

    • 在较新的版本上,我认为习惯用法是先执行@task(bind=True),然后调用self.update_state。性能方面我不确定哪个更好。
    【解决方案2】:

    我开始尝试自己解决这个问题。首先按照Celery userguide 中的说明定义 PROGRESS 状态,然后您只需在模板中插入一个 js 即可更新进度条。

    【讨论】:

    • 链接已过期
    • 更新过时的链接
    【解决方案3】:

    感谢@Florian Sesser 提供的示例!

    我制作了一个完整的 Django 应用程序,向http://iambusychangingtheworld.blogspot.com/2013/07/django-celery-display-progress-bar-of.html的用户显示创建 1000 个对象的进度

    每个人都可以下载使用!

    【讨论】:

    【解决方案4】:

    我会为此推荐一个名为 celery-progress 的库。它旨在尽可能轻松地将基本的端到端进度条设置放入 django 应用程序中,并尽可能少地使用脚手架,同时如果需要还支持前端的大量定制。 README 中有大量文档和参考资料供您入门。

    完全披露:我是该库的作者/维护者。

    【讨论】:

    • 您能提供一个工作示例吗?我被 celery-progress 困住了
    • @MuhammadUmarFarooq 随时提出 celery-progress 中的问题以及您面临的具体问题,我会尽快查看
    • 先生,您可以提供一个github演示,而不是解决个别问题。这样,一个人就可以根据库版本签出所需的提交。谢谢
    • 或者请仅提及您构建演示的版本,我不确定,但我认为 django/celery 最新版本会导致问题。
    • 最新的演示在 Django 3.0.5 和 Celery 4.4.0 上运行,我相信这是截至目前最新的。 @MuhammadUmarFarooq
    猜你喜欢
    • 2018-03-22
    • 2013-02-12
    • 2013-01-13
    • 2013-11-19
    • 2019-11-15
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多