如何从外壳手动运行芹菜定期任务?


Answers:


108

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

假设在子模块的my_taskDjango应用myapp中调用了该任务tasks

$ 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 2013年

@Workonphp不幸的是,我对Pyramid并不熟悉,所以我根本不知道Celery如何与Pyramid集成。(请注意,我上面的解决方案是特定于Django的,需要manage.pyDjango在所有Django项目目录中生成的脚本。)对不起。
白金Azure

19

如果您的意思是仅在不满足条件(例如,不满足定期时间)时触发任务。您可以分两个步骤进行操作。

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

2
它还支持args和kwargs $ celery-yourapp调用app.tasks.update_something --kwargs ='{“ key”:value,...}
AlonS

1
这非常有帮助,但最后缺少括号。已更正:celery -A yourapp call app.tasks.update_something --kwargs='{"key": value,...}'
Erik Kalkoken

尽管inspect功能强大,但不幸的是,它仅适用于“ RabbitMQ(AMQP)和Redis传输”。(例如filesystem,其他人不喜欢)
拉曼

7

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

我已经编辑了答案,所以您不使用不推荐使用的命令。


3
manage.py celeryd现在已弃用: stackoverflow.com/a/23921568/1459594
rschwieb 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.