引言
熟悉Python Web开发的朋友都知道,Celery是编写后台任务的利器。比如一个Web网站在用户注册后需要发送邮箱认证,则可以使用Celery编写一个发送邮件的task异步发送邮件,而不需要在请求上下文那里阻塞,或者起一个线程。
那么,除了以上应用场景,我们还有一个场景是——定时任务。而Celery自带的定时任务功能,配置后是需要重启Celery才能启动的(最新版可能不需要了),而且配置不灵活,无法灵活地增删查改——因为定时任务的配置,是直接写在配置文件或者直接硬编码,不支持放入数据库中。
基于以上需求,我稍微找了下相关工具,django-celery-beat是基本是符合我的需求的,但可惜是基于Django。Flask似乎没有相关工具。
因此,为了解决这个需求,同时也因为本人喜欢Flask,所以花了点时间,参考django-celery-beat的架构和代码,把beat和SQLalchemy等抽离出来,形成一个独立的工具:celery-sqlalchemy-scheduler,这样就可以在Flask上使用类似django-celery-beat的功能了。
为什么标题给 Flask+ 加了括号,是因为这个工具本身可以独立运行,不依赖Flask,但初衷是配合Flask框架使用的,希望能够对标django-celery-beat。
下面是该项目的README。
celery-sqlalchemy-scheduler
一个基于 sqlalchemy 的 scheduler,作为 celery 定时任务的辅助工具。
快速开始
依赖
- Python 3
- celery >= 4.2.0
- sqlalchemy
首先必须安装 celery
和 sqlalchemy
, 并且celery
应该大于等于 4.2.0 版本。
$ pip install celery sqlalchemy
安装
通过 PyPi 安装:
$ pip install celery-sqlalchemy-scheduler
通过 github 仓库进行安装:
$ git clone git@github.com:AngelLiang/celery-sqlalchemy-scheduler.git
$ cd celery-sqlalchemy-scheduler
$ python setup.py install
使用示例
安装celery_sqlalchemy_scheduler
之后,你可以查看examples
目录下的代码:
-
启动 celery worker:
$ celery worker -A tasks -l info
-
使用
DatabaseScheduler
作为 scheduler 启动 celery beat:$ celery beat -A tasks -S celery_sqlalchemy_scheduler.schedulers:DatabaseScheduler -l info
使用说明
beat 启动之后,默认会在当前目录下生成名称为schedule.db
的 sqlite 数据库。Windows 下可以使用 SQLiteStudio.exe 工具打开查看里面的数据。
数据库同步 scheduler 到 beat
当需要更新 scheduler,只需要修改schedule.db
相关数据即可。修改好数据库的 scheduler 后,celery_sqlalchemy_scheduler
并不会马上同步数据库的数据到 beat,我们最后还需要修改celery_periodic_task_changed
表的第一条数据,只需要把last_update
字段更新到最新的时间即可。当 beat 在下一个“心跳”之后,就会同步数据库的数据到 beat。
配置数据库
在配置 Celery 的时候,可以设置 sqlalchemy 数据库的路径,示例如下:
from celery import Celery
celery = Celery('tasks')
beat_dburi = 'sqlite:///schedule.db'
celery.conf.update(
{'beat_dburi': beat_dburi}
)
当然,你可以改为使用 MySQL 数据库:
# 需要安装mysqlconnector:`pip install mysql-connector`
beat_dburi = 'mysql+mysqlconnector://root:root@127.0.0.1/celery-schedule'
- celery-sqlalchemy-scheduler github: https://github.com/AngelLiang/celery-sqlalchemy-scheduler