前言
在web开发中我们经常会遇到一些耗时的操作,比如发送邮件/短信,执行各种任务等等,这时我们会采取异步的方式去执行这些任务,而celery就是这样的一个异步的分布式任务处理框架,官方文档
今天,我们的主题是celery如何与flask一起工作,我们都知道,flask是一个非常小巧的web框架,有许许多多的扩展,celery也不例外,我们先看下目前常用的几个flask-celery的扩展:
Flask-Celery: celery作者本人开发的,其实不算扩展,功能就是安装celery及其相关组件,这里不谈。
Flask-Celery-Helper:曾经的扩展,作者已不维护,不支持现在的4.0版本
Flask-CeleryExt:支持4.0版本,目前比较好用的扩展
除这些扩展之外,其实flask的官方文档中已经给出了在flask中使用celery的方式,不过,那是一个单文件中运行flask的demo,在实际项目中使用,还是有许多需要注意的地方,接下来,我们就一起探究下如何在flask项目中使用celery。
项目结构
├── celery_task # celery任务相关
│ ├── __init__.py
│ ├── tasks.py
│ └── test.py
├── manage.py # celery worker实例
├── requirements.txt # 依赖包
└── test_api # flask 项目
├── api # 蓝本相关
│ ├── __init__.py
│ └── v1
│ ├── __init__.py
│ └── views.py
├── extensions.py # 扩展初始化
├── __init__.py # flask app
├── models.py # 模型文件
└── settings.py # 配置文件
官方示例代码
本项目中没有使用扩展,只是基于官方文档中的示例做进一步的应用。
from celery import Celery
def make_celery(app):
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
celery.conf.update(app.config)
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
return celery
这是一个celery的工厂函数,使用flask app中的配置设置celery相关的属性,并且更改了celery对象的Task,使其能够使用flask的应用上下文,这一点非常重要。我们将这段代码放置到flask项目初始化文件中去也就是testapi/__init_\.py
构建celery对象
celerytask/__init_\.py
rom test_api import create_app, make_celery
app = create_app()
celery = make_celery(app)
class MyTask(celery.Task): # celery 基类
def on_success(self, retval, task_id, args, kwargs):
# 执行成功的操作
print('MyTasks 基类回调,任务执行成功')
return super(MyTask, self).on_success(retval, task_id, args, kwargs)
def on_failure(self, exc, task_id, args,