celery mysql flask_在flask中使用celery的实践

前言

在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,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值