【问题标题】:Django Celery Task how to know it run?Django Celery Task 如何知道它运行?
【发布时间】:2013-03-14 21:04:04
【问题描述】:

我有以下 Django Celery 任务(使用 Amazon SQS)。

@task
def upload_task(request, **kwargs):
    file = request.FILES['file']
    ContactCSVModel.import_from_file(file)
    return True

这似乎有效,即文件已成功添加到我的数据库中,但我不确定它是否完全使用 Celery。我怎么知道这是否有效。我应该看点什么吗?在我跑的终端...

manage.py celery worker --loglevel=info,其中指出我有一个名为 contacts.tasks.upload_task 的任务,但我从来没有看到任何事情发生,它只是说...

[2013-03-14 20:52:47,947:INFO/MainProcess] 消费者:连接到 sqs://AJSUQJZKNSJA81JM@localhost//

知道我的任务是否已经运行并完成(是的,我知道它已经完成,因为它在数据库中,但这是通过 Celery 完成的吗?)

这是运行任务的地方

views.py

@login_required
def upload(request):
    # If we had a POST then get the request post values.
    if request.method == 'POST':
        form = ContactUploadForm(request.POST, request.FILES)
        # Check we have valid data
        if form.is_valid():
            upload_task(request)
            #file = request.FILES['file']
            #ContactCSVModel.import_from_file(file)
            messages.add_message(request, messages.SUCCESS, 'Items have been added')
        else:
            messages.add_message(request, messages.ERROR, ' Cannot upload CSV file.')

            return render_to_response('contacts/home.html', context_instance=RequestContext(request))
    else:
        form = ContactUploadForm()
        # Do this part no matter the outcome above.
    context = {'form': form}
    return render_to_response('contacts/home.html', context, context_instance=RequestContext(request))

就像我说的那样,这可以将 csv 数据加载到数据库中,但我认为 Celery 没有做任何事情。

这是我的 Celery 设置....

# Celery
BROKER_TRANSPORT_OPTIONS = {'queue_name_prefix': 'celery-'}
BROKER_TRANSPORT = 'sqs'
BROKER_TRANSPORT_OPTIONS = {
    'region': 'eu-west-1',
    }
BROKER_USER = 'xyz'
BROKER_PASSWORD = 'xyz'

【问题讨论】:

  • 你能分享你输入的运行任务吗?即,如果您尝试在 shell 中运行它,您输入的行...
  • 当然,刚刚更新:)

标签: django django-celery


【解决方案1】:

您没有在 Celery 工作日志中看到该任务的证据的原因是您实际上并没有异步调用您的任务。在您的views.py 中,而不是upload_task(request),尝试upload_task.delay(request),然后查看工作人员日志。为了让任务修饰函数异步运行,您必须使用 .delay() 或 .apply_async() 方法。在文档中的其他地方,这包括 here

更一般地说,如果您正在寻找一种更具视觉吸引力的方式来跟踪和管理任务,请查看celery flower

【讨论】:

  • 没问题,很高兴为您提供帮助。您是否愿意选择我的答案作为正确答案(假设您的问题已完全回答)?
  • 感谢花的链接,这是我将要研究的东西,非常有用。
猜你喜欢
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2013-02-02
  • 1970-01-01
  • 2016-10-17
  • 2018-01-29
  • 2017-11-14
相关资源
最近更新 更多