使用 django 和 celery 运行定期任务

Posted

技术标签:

【中文标题】使用 django 和 celery 运行定期任务【英文标题】:Running periodic tasks with django and celery 【发布时间】:2012-05-09 11:35:47 【问题描述】:

我正在尝试使用 Django-Celery-RabbitMQ 组合创建一个简单的后台定期任务。我安装了 Django 1.3.1,我下载并设置了 djcelery。这是我的 settings.py 文件的样子:

BROKER_HOST = "127.0.0.1"
BROKER_PORT = 5672
BROKER_VHOST = "/"
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
....
import djcelery
djcelery.setup_loader()
...
INSTALLED_APPS = (
    'djcelery',
)

我在我的应用程序文件夹中放置了一个“tasks.py”文件,内容如下:

from celery.task import PeriodicTask
from celery.registry import tasks
from datetime import timedelta
from datetime import datetime

class MyTask(PeriodicTask):
    run_every = timedelta(minutes=1)

    def run(self, **kwargs):
        self.get_logger().info("Time now: " + datetime.now())
        print("Time now: " + datetime.now())

tasks.register(MyTask)

然后我启动我的 django 服务器(本地开发实例):

python manage.py runserver

然后我启动celerybeat进程:

python manage.py celerybeat --logfile=<path_to_log_file> -l DEBUG

我可以在日志中看到这样的条目:

[2012-04-29 07:50:54,671: DEBUG/MainProcess] tasks.MyTask sent. id->72a5963c-6e15-4fc5-a078-dd26da663323

我还可以看到在数据库中创建了相应的条目,但我找不到它在哪里记录我在 MyTask 类的实际 run 函数中指定的文本。

我尝试摆弄日志记录设置,尝试使用 django 记录器而不是 celery 记录器,但没有用。我什至不确定,我的任务正在执行。如果我在任务中打印任何调试信息,它会去哪里?

另外,这是我第一次使用任何类型的消息队列系统。看起来该任务将作为celerybeat 进程的一部分在 django web 框架之外执行。我仍然可以访问我创建的所有 django 模型吗?

谢谢, 文卡特。

【问题讨论】:

你在运行 celeryev 时看到了什么? 【参考方案1】:

Celerybeat 它的东西,它在需要时推送任务,但不执行它们。您的任务实例存储在 RabbitMq 服务器中。你需要执行 celeryd 守护进程来执行你的任务。

python manage.py celeryd --logfile=<path_to_log_file> -l DEBUG

另外,如果你使用 RabbitMq,我建议你安装专用的 rabbitmq 管理插件:

rabbitmq-plugins list
rabbitmq-enable rabbitmq_management
service rabbitmq-server restart

它将在 http://:55672/ 登录:访客通行证:访客。在这里你可以在线查看你的兔子实例中有多少任务。

【讨论】:

【参考方案2】:

您应该检查 RabbitMQ 日志,因为 celery 将任务发送到 RabbitMQ 并且它应该执行它们。所以所有的任务打印都应该在 RabbitMQ 日志中。

【讨论】:

以上是关于使用 django 和 celery 运行定期任务的主要内容,如果未能解决你的问题,请参考以下文章

Django + Telegram + Celery 的定期和非定期任务

Django Celery Beat 管理员更新 Cron Schedule 定期任务未生效

安排 Django Celery 定期任务从某个时间运行到另一个时间

Django celery 定期任务间隔更改未在数据库中更新

Django 1.9 + celery + django-celry 实现定时任务

Django 和 Celery 的示例:周期性任务