基于(Flask+)Celery+SQLalchemy的定时任务工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012163234/article/details/85543684

引言

熟悉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

首先必须安装 celerysqlalchemy, 并且celery应该大于等于 4.2.0 版本。

$ pip install celery sqlalchemy

安装

通过 PyPi 安装:

$ pip install celery-sqlalchemy-scheduler

通过 github 仓库进行安装:

$ git clone [email protected]:AngelLiang/celery-sqlalchemy-scheduler.git
$ cd celery-sqlalchemy-scheduler
$ python setup.py install

使用示例

安装celery_sqlalchemy_scheduler之后,你可以查看examples目录下的代码:

扫描二维码关注公众号,回复: 4740808 查看本文章
  1. 启动 celery worker:

    $ celery worker -A tasks -l info
    
  2. 使用DatabaseScheduler作为 scheduler 启动 celery beat:

    $ celery beat -A tasks -S celery_sqlalchemy_scheduler.schedulers:DatabaseScheduler -l info
    

使用说明

beat 启动之后,默认会在当前目录下生成名称为schedule.db的 sqlite 数据库。Windows 下可以使用 SQLiteStudio.exe 工具打开查看里面的数据。

sqlite

数据库同步 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:[email protected]/celery-schedule'

猜你喜欢

转载自blog.csdn.net/u012163234/article/details/85543684
今日推荐