【问题标题】:How can I run a celery periodic task from the shell manually?如何手动从 shell 运行 celery 定期任务?
【发布时间】:2012-10-05 16:28:45
【问题描述】:

我正在使用 celery 和 django-celery。我已经定义了一个我想测试的定期任务。是否可以手动从 shell 运行定期任务以便我查看控制台输出?

【问题讨论】:

    标签: python django celery django-celery celery-task


    【解决方案1】:

    您是否尝试过仅从 Django shell 运行任务?您可以使用任务的.apply 方法来确保它在本地快速运行。

    假设任务在 Django 应用程序 myapp 中的 tasks 子模块中调用 my_task

    $ python manage.py shell
    >>> from myapp.tasks import my_task
    >>> eager_result = my_task.apply()
    

    结果实例与通常的 AsyncResult 类型具有相同的 API,只是结果总是在本地急切地求值,.apply() 方法将阻塞直到任务运行完成。

    【讨论】:

    • 我怎样才能为金字塔项目做同样的事情?目录结构如下: /myproject=> celeryconfig.py, setup.py, development.py, /views/celerytasks=> mycelerytask.py 。现在我要运行'mycelerytask.py'(这是周期性任务)从命令行手动。你能帮忙吗?
    • @Workonphp 不幸的是,我不熟悉 Pyramid,所以我根本不知道 Celery 是如何与 Pyramid 集成的。 (请注意,我上面的解决方案是 Django 特定的,需要 Django 在所有 Django 项目目录中生成的 manage.py 脚本。)抱歉。
    【解决方案2】:

    如果您的意思是在条件不满足时触发任务,例如,周期时间不满足。您可以分两步完成。

    1.获取您的任务 ID。

    你可以通过打字来做到这一点。

    celery inspect registered
    

    您会看到类似app.tasks.update_something 的内容。 如果没有,可能是celery 没有启动。运行它。

    2.使用celery call运行任务

    celery call app.tasks.update_something
    

    更多详情,只需输入

    celery --help
    celery inspect --help
    celery call --help
    

    【讨论】:

    • 它还支持args和kwargs $ celery -A yourapp call app.tasks.update_something --kwargs='{"key": value,...}
    • 这很有帮助,但最后少了一个括号。更正:celery -A yourapp call app.tasks.update_something --kwargs='{"key": value,...}'
    • 虽然inspect 很棒,但不幸的是它只适用于“RabbitMQ (AMQP) 和 Redis 传输”。 (而不是像 filesystem 这样的其他人)
    【解决方案3】:

    我认为您需要打开两个 shell:一个用于从 Python/Django shell 执行任务,另一个用于运行 celery worker (python manage.py celery worker)。正如前面的答案所说,您可以使用apply()apply_async() 运行任务

    我已经编辑了答案,所以你没有使用过时的命令。

    【讨论】:

    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2012-05-09
    • 2021-06-15
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多