如何使用Celery和Docker处理Django中的定期任务

2020-06-17 07:27:11易采站长站整理

任务声明要运行的任务。

时间表设置任务应运行的时间间隔。 这可以是整数,时间增量或crontab。 我们在任务中使用了crontab模式,告诉它每分钟运行一次。 您可以在此处找到有关Celery日程安排的更多信息。

确保添加导入:


from celery.schedules import crontab

import core.tasks

重启容器,应用变更:


$ docker-compose up -d --build

查看日志:


$ docker-compose logs -f 'celery'
celery_1 | -------------- [queues]celery_1 | .> celery exchange=celery(direct) key=celery
celery_1 |
celery_1 |
celery_1 | [tasks]celery_1 | . core.tasks.sample_task

我们可以看到Celery获得了示例任务core.tasks.sample_task。

每分钟,您应该在日志中看到一行以“示例任务刚刚运行”结尾的行:

celery_1  | [2020-04-15 22:49:00,003: INFO/MainProcess]              Received task: core.tasks.sample_task[8ee5a84f-c54b-4e41-945b-645765e7b20a]celery_1  | [2020-04-15 22:49:00,007: WARNING/ForkPoolWorker-1] The sample task just ran.

自定义Django Admin命令

Django提供了许多内置的django-admin命令,例如:

迁移

启动项目

startapp

转储数据

移民

除了内置命令,Django还为我们提供了创建自己的自定义命令的选项:

自定义管理命令对于运行独立脚本或从UNIX crontab或Windows计划任务控制面板定期执行的脚本特别有用。

因此,我们将首先配置一个新命令,然后使用Celery Beat自动运行它。

首先创建一个名为orders / management / commands / my_custom_command.py的新文件。 然后,添加运行它所需的最少代码:


from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):
help = "A description of the command"

def handle(self, *args, **options):
pass

BaseCommand有一些可以被覆盖的方法,但是唯一需要的方法是handle。 handle是自定义命令的入口点。 换句话说,当我们运行命令时,将调用此方法。

为了进行测试,我们通常只添加一个快速打印语句。 但是,建议根据Django文档使用stdout.write代替:

当您使用管理命令并希望提供控制台输出时,应该写入self.stdout和self.stderr,而不是直接打印到stdout和stderr。 通过使用这些代理,测试自定义命令变得更加容易。 另请注意,您无需以换行符结束消息,除非您指定结束参数,否则它将自动添加。

因此,添加一个self.stdout.write命令:


from django.core.management.base import BaseCommand, CommandError