现在继续学习在集成的框架中如何使用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

最新文章

  1. Hbase+ Phoenix搭建教程
  2. UTF-8 ->GBK
  3. HDU3068 最长回文串
  4. 说说设计模式~观察者模式(Observer)
  5. PLT:说说Evaluation strategy
  6. Calculation
  7. JQuery Pagenation 知识点整理——phototype 应用(20150517)(转)
  8. Oracle Data Guard PING[ARC2]: Heartbeat failed to connect to standby ''. Error is 12514 故障分析
  9. vlc
  10. ajax 分页控件,基于jquery
  11. VS2012 编写C++程序的时候DOS窗口一闪而过解决办法。
  12. echarts学习总结(一):图表溢出窗口,图表数据窗口显示不全
  13. Canvas的下雪效果
  14. Linux进程间通信--信号量
  15. Mac下Git安装及配置
  16. MOOS学习笔记4——独立线程不同回调
  17. [Swift]LeetCode836. 矩形重叠 | Rectangle Overlap
  18. Groovy&开发环境
  19. method&interface
  20. Error Code: 1786 Statement violates GTID consistency: CREATE TABLE ... SELECT.

热门文章

  1. 剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)
  2. 《Cracking the Coding Interview》——第17章:普通题——题目3
  3. 《Cracking the Coding Interview》——第13章:C和C++——题目6
  4. Python SimpleHTTPServer简单HTTP服务器
  5. install ironic-inspector
  6. 【LeetCode】Swap Nodes in Pairs(两两交换链表中的节点)
  7. Flex学习笔记
  8. user namespace 2
  9. mac系统安装/升级node
  10. javascript replace 替换全部字符