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

在Flask中使用celery

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

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

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

celery在flask中初始化

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

  1. from celery import Celery
  2. from flask import Flask
  3.  
  4. app = Flask(__name__)
  5.  
  6. def make_celery(app):
  7. celery = Celery(app.import_name)
  8. celery.conf.update(app.config)
  9. return celery
  10.  
  11. celery = make_celery(app)
  12. # celery的配置文件在app的setting中;

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

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

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

  • 安装Flask-Celery-Helper

  1. pip install Flask-Celery-Helper
  • 将所有额外的需要初始化的对象独立出来在一个单独的py模块。
  1. # extensions.py
  2. from flask_celery import Celery
  3. # 创建celery的实例
  4. celery = Celery()
  5.  
  6. # __init__.py
  7. from extensions import celery
  8.  
  9. def create_app(config_name)
  10. app = Flask(__name__)
  11. config_class = config_map[config_name]
  12. app.config.from_object(config_class)
  13. # 对celery进行初始化操作,可以将celery的配置写在app的配置中
  14. celery.init_app(app=app)
  15.  
  16. # tasks.py
  17. from extensions import celery
  18.  
  19. @celery.task()
  20. def add(x,y):
  21. return x + y

注意

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

  • 调用task方法

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

启动celery

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

  1. # run_celery.py
  2. import create_app
  3. flask_app = create_app("develop") # 创建app的同时,对celery完成了加载配置的工作
  4. from extensions import celery # 此时的celery对象已经在上下文中完成初始化
  1. # 找到celery实例的位置,指定worker,指定接收某个队列的消息,如果不指定则接收所有队列的消息
  2. 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. 《Cracking the Coding Interview》——第14章:Java——题目6

    2014-04-26 19:11 题目:设计一个循环数组,使其支持高效率的循环移位.并能够使用foreach的方式访问. 解法:foreach不太清楚,循环移位我倒是实现了一个,用带有偏移量的数组实现 ...

  2. leetcode 【 Intersection of Two Linked Lists 】python 实现

    题目: Write a program to find the node at which the intersection of two singly linked lists begins. Fo ...

  3. Java SE 5.0 - SE 8 的功能增强

    Table of Contents 前言 Java 5.0 Generics Enhanced for Loop Autoboxing Typesafe Enums Varargs Static Im ...

  4. js 全局变量和局部变量

    Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),但是不能对变量定义做提前解析 1.作用域和作用域链 2.变量声明提前

  5. [译]8-spring bean的作用域

    在spring中使用<bean/>标签定义bean的时候,可以使用scope属性来定义bean的作用域.如果想要每次 从spring容器得到一个新创建的bean实例,可以指定scope=& ...

  6. 线段树(单点更新,区间查询) HDU 1754 I Hate It

    题目链接 线段树的模板 #include<iostream> #include<cstdio> #include<cmath> #include<algori ...

  7. Go的HttpClient实现

    Go作为相对java更新的语言,本身的http模块就有客户端请求的实现,继上一章Java的实现,这里记录Go的实现,接下来还有python的实现 注(go版本1.6) package main imp ...

  8. SPOJ 364 Pocket Money 简单DP

    跟矩阵链乘同类型的题…… 输出用%llu不是%I64u…… 几组数据: 141+2*4+3*4+5*00*5*6+7*3+23+0+6+7+0+44*5+7*1*1+12*0+3*4*0+5*6+7+ ...

  9. EF异常:对一个或多个实体的验证失败

    try catch 捕获到错误.然后看.找到哪个是没填的..... 我是这种错误.

  10. [BZOJ4205][FJ2015集训] 卡牌配对 [建图+最大流]

    题面 这是bzoj权限题,题面可以去下面的离线题库找 离线4205,只有题面,不能提交 思路 二分图匹配 这道题模型显然就是个二分图匹配嘛 那我们两两判断一下然后连边匹配.....就只有30分了 因为 ...