现在继续学习在集成的框架中如何使用celery.

在Flask中使用celery

在Flask中集成celery需要做到两点:

  1. 创建celery的实例对象的名字必须是flask应用程序app的名字,否则celery启动会失败;

  2. celery必须能顺利加载初始化文件。

celery在flask中初始化

由于celery进程的运行和flask进程的运行是相互独立的,但是在框架中我们希望只使用一份配置文件,这样可以简化配置的工作。

from celery import Celery
from flask import Flask app = Flask(__name__) def make_celery(app):
celery = Celery(app.import_name)
celery.conf.update(app.config)
return celery celery = make_celery(app)
# celery的配置文件在app的setting中;

问题:上面的做法程序在初始化的时候可以完成celery的初始化,但是当使用工厂模式创建app的时候,celery的初始化变得困难;

from celery import Celery
from flask import Flask celery = None def make_celery(app):
celery = Celery(app.import_name)
celery.conf.update(app.config)
return celery def create_app(config_name)
app = Flask(__name__)
config_class = config_map[config_name]
app.config.from_object(config_class)
# 初始化celery
global celery
celery = make_celery(app)
  • 问题:由于程序初始化的时候并不能创建出app对象,所以celery启动的时候必须先在tasks中导入app对象才能完成初始化,可能导致循环导入的错误;

  • 解决:引入Flask-Celery-Helper,帮助我们初始化celery对象;

  • 安装Flask-Celery-Helper

pip install Flask-Celery-Helper
  • 将所有额外的需要初始化的对象独立出来在一个单独的py模块。
# extensions.py
from flask_celery import Celery
# 创建celery的实例
celery = Celery() # __init__.py
from extensions import celery def create_app(config_name)
app = Flask(__name__)
config_class = config_map[config_name]
app.config.from_object(config_class)
# 对celery进行初始化操作,可以将celery的配置写在app的配置中
celery.init_app(app=app) # tasks.py
from extensions import celery @celery.task()
def add(x,y):
return x + y

注意

  • Flask-Celery-Helper官方目前只支持到python3.4,但楼主使用py3.6也没有问题;Flask-Celery-Helper不支持celery4.X的版本,否则报错,因此需要使用celery3.x的版本;

  • 调用task方法

# app.py

from tasks import add
@app.route("/index")
def index():
"""一个测试的实例"""
print(add(3+6)) # add函数也能做普通的函数使用
add.apply_async(args=[5,7], queue='eegqueue') # 发送异步任务,指定队列 return "ok!"

启动celery

启动celery之前需要加载flask的app的配置,因此需要创建一个app对象给celery使用。

# run_celery.py
import create_app
flask_app = create_app("develop") # 创建app的同时,对celery完成了加载配置的工作
from extensions import celery # 此时的celery对象已经在上下文中完成初始化
# 找到celery实例的位置,指定worker,指定接收某个队列的消息,如果不指定则接收所有队列的消息
celery -A run_celery.celery worker -Q eegqueue --loglevel=info

Flask插件系列之flask_celery的更多相关文章

  1. flask插件系列之flask_celery异步任务神器

    现在继续学习在集成的框架中如何使用celery. 在Flask中使用celery 在Flask中集成celery需要做到两点: 创建celery的实例对象的名字必须是flask应用程序app的名字,否 ...

  2. flask插件系列之flask_uploads上传文件

    前言 flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的. 安装 pip install flask_uploads 基本使用 # e ...

  3. flask插件系列之flask_caching缓存

    前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...

  4. flask插件系列之flask_session会话机制

    flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制. 配置参数详解 SESSION_COOKIE_NAME 设置返回给客户端的c ...

  5. flask插件系列之Flask-WTF表单

    flask_wtf是flask框架的表单验证模块,可以很方便生成表单,也可以当做json数据交互的验证工具,支持热插拔. 安装 pip install Flask-WTF Flask-WTF其实是对w ...

  6. flask插件系列之flask_restful设计API

    前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...

  7. flask插件系列之flask_cors跨域请求

    前后端分离在开发调试阶段本地的flask测试服务器需要允许跨域访问,简单解决办法有二: 使用flask_cors包 安装 pip install flask_cors 初始化的时候加载配置,这样就可以 ...

  8. flask插件系列之SQLAlchemy基础使用

    sqlalchemy是一个操作关系型数据库的ORM工具.下面研究一下单独使用和其在flask框架中的使用方法. 直接使用sqlalchemy操作数据库 安装sqlalchemy pip install ...

  9. flask插件系列之SQLAlchemy实用技巧

    下面记录一下SQLAlchemy使用的技巧. 在多模块下定义models 如果由多个蓝图下读定义了model模块,在初始化的时候需要加载到上下文中. 当使用flask_Migrate迁移数据库的时候, ...

随机推荐

  1. 《算法》C++代码 Dijkstra

    单源最短路,复杂度是O(N²),堆优化的是O(NlogN).基本思想是贪心,每次都加入一个当前最近的点,可以证明每次当时最近的点就是当前最短的路径.因此,所有点都加入之后,起点到所有点的最短路径就都求 ...

  2. Python 3基础教程13-写入文件

    前面介绍了函数,这篇我们就利用Python 内构函数open来写入字符串到txt文件里. 直接看demo.py 这里有一个小问题,如果我要输入时中文到txt文件会报unicode错误,暂时没法解决.

  3. Pytest 断言

    pytest 断言 断言:一个标准的用例都包含了断言,编写pytest自动化脚本的时候,也需要设置断言 assert使用 常用分三种 1:比较大小与是否相等 2:包含或不包含  3:验证boolean ...

  4. A. Vasya and Book

    题目原址 http://codeforces.com/contest/1082/problem/A 题目内容 一共n页书,现在位于第x位,想要看第y页,每次只能翻d页,注意总能翻到第1页和第n页. V ...

  5. springboot02 Thymeleaf

    一.http协议 1. 什么是协议? 协议是交易双方共同遵守的一种约定,比如: 租房协议 , 购买协议.... 2. 什么是http协议? HTTP协议是Hyper Text Transfer Pro ...

  6. CentOS6.5下搭建LAMP环境(源码编译方式)

    CentOS 6.5安装配置LAMP服务器(Apache+PHP5+MySQL) 学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP ,WAMP,MAMP等.这里我介 ...

  7. Eclipse中安装svn的插件安装和使用

    先关闭Eclipse 步骤一:下载site-1.10.11.zip  将其解压 解压后目录 步骤二:创建一个文件夹svn,将解压后的文件copy到svn路径下 步骤三:打开Eclipse安装路径: e ...

  8. ubuntu16.04 搭建nexus+maven 学习

    /opt/nexus-2.10.0-02/bin vim nexus 关键配置: RUN_AS_USER=root JAVA_HOME=/usr/lib/java/jre export NEXUS_H ...

  9. 点对点协议(Point-to-Point Protocol)

    简介 点对点协议简称PPP协议,工作在数据链路层.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机. 网桥和路由器之间简单连接的一种共通的解决方案. PPP协议的组成 建立 ...

  10. Centos 6.5 HISTSIZE更改

    通过 更改 /etc/profile 中的HISTSIZE值,改完之后,执行source /etc/profile  和echo $HISTSIZE,结果还是之前的HISTSIZE值, 解决办法:执行 ...