Celery 定时任务的启动方式

工作中踩了一些坑,抽空整理了一下。现阶段启动 celery beat一般有两种方式:

直接启动

在生产环境中推荐使用这种方式。可以在supervisor中新增一个配置文件来启动。并在ansible配置文件中添加重启项目。

$ celery -A proj beat

Beat 服务需要一个地方存储上次定时任务运行的时间(默认名为celerybeat-schedule,是一个本地shelve数据库文件),所以要确保 Beat 在该文件所在的目录有写权限。否则会因为权限报错。可以通过以下命令指定celerybeat-schedule目录:

$ celery -A proj beat -s /home/celery/var/run/celerybeat-schedule

在启动 Worker 时增加参数

虽然这种方式在只启动一个 worker 节点的时候很方便,但通常在生产环境中不推荐这种方式。因为生产环境常常启动多个 worker 节点,这种启动方式会导致每个worker节点都启动一个beat服务,可能会重复执行事先做好的定时任务。

$ celery -A proj worker -B

其他

使用 Django 插件

默认的调度程序用本地的shelve数据库文件来储存定时任务上次运行的时间,使用django-celery-beat可以将这些信息储存在 Django 数据库中。

  • 安装包

    $ pip install django-celery-beat
  • 在配置文件中将改包加入INSTALLED_APPS配置项中

    INSTALLED_APPS = (
    ...,
    'django_celery_beat',
    )
    ```

    - 运行 Django 数据库迁移来创建表

    ```cmd
    $ python manage.py migrate
  • 调用 Beat 时使用参数

    $ celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler