Flask-Celery使用说明

原创 2017年01月04日 23:26:15

简介

Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache

flask-celery应用

celery和flask框架结合,实现flask网络框架中定时任务。建议各依赖模块使用virtualenv在虚拟环境下安装。

第一步是配置消息中间件

本人使用redis,redis是一个开源的、内存存储d额数据结构服务器,可用作数据库、高速缓存和消息队列代理,此处取其消息队列代理和数据库功能。 python配置:

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

redis的安装使用可参考https://redis.io/,需要注意的原版redis由于效率问题不支持windows操作系统,微软开放技术小组(Microsoft Open Tech group)开发和维护64位windows的版本,地址https://github.com/MSOpenTech/redis,使用vs2013工程组织代码。

代码示例

from flask import Flask, render_template, jsonify
from celery import Celery

import time
 
demo = Flask("demo")
demo.config.from_object('config')

celery = Celery("demo", broker=demo.config['CELERY_BROKER_URL'])
celery.conf.update(demo.config)

...

if __name__ == '__main__':
    demo.debug=True
    demo.run(port=5000)

第二步是配置任务执行单元,由celery的worker模块实现。 
第三步配置任务结果存储工具,redis的数据库功能可实现。

配置好以上三个步骤之后,即可启动celery模块和flask应用

启动celery模块:

$(venv) celery worker -A you_app -l info

单独启动flask应用:

$(venv) python app.py

完整示例

# -*- coding: utf-8 -*-

activate_this = './venv/Scripts/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys
sys.path.insert(0, '../demo')
sys.stdout = sys.stderr

from flask import Flask, render_template, jsonify
from celery import Celery

import time
 
demo = Flask("demo")

demo.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
demo.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'

celery = Celery("demo", broker=demo.config['CELERY_BROKER_URL'])
celery.conf.update(demo.config)

@demo.route('/', methods=['GET'])
@demo.route('/index', methods=['GET', 'POST'])
def index():
    return render_template('index.html')
    
@celery.task(bind=True)
def long_task(self):
    while True:
        print("sleep")
        time.sleep(15)
        
    return True

@demo.route('/longtask', methods=['GET', 'POST'])
def longtask():
    long_task.apply_async()
    return jsonify({}),200
    
import gevent.pywsgi

if __name__ == '__main__':   
    gevent_server = gevent.pywsgi.WSGIServer(('', 8082), demo)
    gevent_server.serve_forever()

注意

启动celery时,工作文件夹必须要在you_app.py文件所在文件夹,否则会提示找不到you_app模块,另外在创建flask应用时也要使用

you_app=Flask(__name__)

否则会有

AttributeError: 'Flask' object has no attribute 'user_options'

的错误。

References:

  1. http://blog.csdn.net/liuxiaochen123/article/details/47981111
  2. https://github.com/MSOpenTech/redis
  3. http://stackoverflow.com/questions/25884951/attributeerror-flask-object-has-no-attribute-user-options
  4. http://www.pythondoc.com/flask-celery/first.html

flask+celery常见问题及解决方法

1、 [root@ansible flask_celery]# celery -A app worker --loglevel=info Traceback (most recent call l...
  • lixingdefengzi
  • lixingdefengzi
  • 2016年06月27日 17:15
  • 3602

在 Flask 中使用 Celery

在 Flask 中使用 Celery 后台运行任务的话题是有些复杂,因为围绕这个话题会让人产生困惑。为了简单起见,在以前我所有的例子中,我都是在线程中执行后台任务,但是我一直注意到更具有扩展性以...
  • sedrtse
  • sedrtse
  • 2016年12月11日 11:07
  • 657

用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务

目录目录 前文列表 扩展阅读 Celery 将 Celery 加入到应用中 实现向新用户发送欢迎邮件 前文列表用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2)...
  • Jmilk
  • Jmilk
  • 2016年12月15日 21:48
  • 4935

使用flask 发送电子邮件时候遇到的几个问题

1. flask 框架http://flask.pocoo.org/ flask 是python 用于web 开发的一个非常有用的微框架, 特点是易于自定义扩展, 使用简单, 方便2. flask-m...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年06月04日 17:19
  • 2949

Python-模块和包.深入Celery之Beat触发定时/周期性任务

任务调度: 1. Celery默认任务单元由任务生产者触发,但有时可能需要其自动触发,而Beat进程正是负责此类任务,能够自动触发定时/周期性任务. 1 2 3 4 5 ...
  • LearnboC
  • LearnboC
  • 2017年06月19日 15:45
  • 509

Celery定时任务

Celery定时任务配置启用Celery的定时任务需要设置CELERYBEAT_SCHEDULE 。 Celery的定时任务都由celery beat来进行调度。celery beat默认按照s...
  • sicofield
  • sicofield
  • 2016年03月20日 16:59
  • 13326

Flask-Celery使用说明

简介 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。 消息中间件 ...
  • junchen19
  • junchen19
  • 2017年01月04日 23:26
  • 601

celery 报错处理

node2:/celery/djtest#python manage.py celeryd -l info Traceback (most recent call last): File "man...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2017年12月21日 19:28
  • 92

kindle paperwhite 使用说明

txt 如何转换 mobi
  • wide288
  • wide288
  • 2013年08月04日 18:37
  • 1678

小熊鼠标键盘模拟工具 使用说明 及核心代码

旧版本有些问题,请下载新版本 最版版本一载地址 很多人问的问题是怎么模拟向QQ群发送信息的  其实标题就说了是模拟鼠标,按键。 具体哪些按键呢,可能有些人习惯鼠标操作不太清楚,其实也很...
  • zanfeng
  • zanfeng
  • 2015年01月11日 14:26
  • 1476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Flask-Celery使用说明
举报原因:
原因补充:

(最多只允许输入30个字)