【问题标题】:My custom django-admin command won't call celery task我的自定义 django-admin 命令不会调用 celery 任务
【发布时间】:2017-12-05 14:35:22
【问题描述】:

我正在尝试编写一个执行 celery 任务的自定义 django-admin 命令,但是该任务没有执行,并且当我尝试时 django 只是挂起。

from django.core.management.base import BaseCommand
from myapp.tasks import my_celery_task

class Command(BaseCommand):
    def handle(self, *args, **options):
        print "starting task"
        my_celery_task.delay()
        print "task has been sent"

调用命令时我收到的输出是:

starting task

我从来没有到达“任务已发送”这一行。它只是挂起。我不确定为什么任务没有运行。当被视图调用时,Celery 任务被完美调用。

【问题讨论】:

  • 你导入my_celery_task任务了吗?
  • @MuhammadShoaib 是的,它已被导入(只是编辑了问题以显示它)
  • 您是否使用日志启动了芹菜工人以获取更多信息? docs.celeryproject.org/en/latest/userguide/…
  • 控制台应该有东西,如果有错误。
  • 不客气 :)

标签: python django celery django-celery django-commands


【解决方案1】:

这似乎对我使用 celery 5.1.2 有效,但如果它是 shared_task 则不行

====== tasks.py

from celery import current_app
from celery.schedules import crontab
app = current_app._get_current_object()

@app.task
def my_celery_task():
    # Do something interesting
    return 0 # Return the result of this operation

====== my_command.py

from accounts.tasks import my_celery_task
...
    def handle(self, *args, **options):
        self.stdout.write("Queing request")
        result = my_celery_task.delay()
        self.stdout.write("Waiting for task to end")
        updated = result.wait(timeout=120.0)

        self.stdout.write(f"Returned {updated}")

而且,如果我将任务放在 celery.py 文件中,我最终会遇到一个死锁,这是一个要调试的 PITA

【讨论】:

    【解决方案2】:

    问题实际上是升级到 High Sierra 后 Mac 上的 RabbitMQ。

    【讨论】:

    • Mac 上的 RabbitMQ 有什么问题??????
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2016-03-22
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多