Flask中使用celery队列处理执行时间较长的请求。

一. 安装celery

pip install celery flask  redis

二. celery简介

Celery是个异步分布式任务队列
通过Celery在后台跑任务并不像线程那么简单,但是用Celery的话,能够是应用有较好的扩展性,因为Celery是个分布式架构,下面介绍Celery的三个核心组件:
1. 生产者(Celery client): 生产者发送消息,在Flask上工作时,生产者在Flask应用内运行
2. 消费者(Celert worker): 消费者用于处理后台任务。消费者可以是本地的也可以是远程的。我们可以在运行Flask的server上运行一个单一的消费者,当业务量上涨之后再去添加更多的消费者
3. 消息传递着(Celery broker): 生产者和消费者的信息交互使用的是消息队列,Celery支持若干方式的消息队列,其中最长用的是RabbitMQ和Redis, 我们在使用过程中使用的Redis

三. redis配置与使用

redis配置文件/etc/redis.conf

1.设置为后台启动
daemonize yes
2.redis端口设置
port 6379 # default prot
3.日志文件
logfile /home/liuyadong/work/log/redis.log
4.数据保存文件
dir /home/liuyadong/data/redisData 通过下面命令指定配置文件启动redis:
redis-server /etc/redis.conf 通过下面命令测试是否启动成功:
redis-cli -p 6379
下面这样表示成功(进入了命令行模式):
redis 127.0.0.1:6379> 查看启动端口:
sudo netstat -ntlp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 49380/redis-server

四. celery使用简介

1.Choosing a broker
最常用的broker包括: RabbitMQ 和 Redis, 我们使用Redis, Redis的安装及启动等查看第二部分 2.intall celery
pip install celery 3.Application
使用celery的第一步是创建一个application, 通常叫做'app'。具体的创建一个app的代码如下:
$ cat tasks.py
#!/usr/bin/env python
from celery import Celery app = Celery('tasks', broker='redis://localhost')
@app.tasks
def add(x, y):
return x + y Note: Celery第一个参数必须是当前module的模拟购置,本次实例中为:tasks 4.Running the celery worker server
$ celery -A tasks worker --loglevel=info 5.Calling the tasks
可以通过delay()或者apply_sync()方法来调用一个task
>>> from tasks import add
>>> add.delay(4, 4) 6. Keeping Results
我们可以将task的执行状态保存起来,可以保存到broker中, 可以通过CELERY_RESULT_BACKEND字段来设置保存结果。
也可以通过Celery的backend参数来设置
app.Celery('tasks', broker='redis://localhost', backend='redis://localhost') >>> result = add.delay(4, 4)
可以通过ready()方法来判断程序执行是否完成,执行完成返回True.
>>> result.ready()
False 下面是AsyncResult对象的其他调用方法介绍:
1) AsyncResult.get(timeout=None, propagate=True, interval=0.5, no_ack=True, follow_parents=True) timeout : 设置一个等待的预操作时间,单位是s, 方法返回执行结果
propagate : 如果task执行失败,则Re-taise Exception
interval : 等待一定时间重新执行操作,如果使用amqp来存储backend则此参数无效
no_ack : Enable amqp no ack (automatically acknowledge message)
If this is False then the message will not be acked
follow_parents : Reraise any exception raised by parent task 2) AsyncResult.state 或 status属性
方法返回当前task的执行状态,返回值包括下面多种情况:
PENDING: task正在等待执行
STARTED: task已经开始执行了
RETRY : task重新执行了,这可能是由于第一次执行失败引起的
FAILURE: task执行引发了异常,并且结果的属性当中包括了异常是由哪个task引起的
SUCCESS: task执行成功,结果的属性当中包括执行结果 3) AsyncResult.success()
如果返回True,则表示task执行成功 4) AsyncResult.traceback()
得到一个执行失败的task的traceback 7.Configuration celert
默认的配置对于大多数用户来说已经足够好了,但是我们仍有许多想让celery按照我们的想法去work,通过configuration实现是一个好的方式。 configutation可以通过app设置,也可以通过一个单独的模块进行设置。
比如,通过app设置CELERY_TASK_SERIALIZER属性:app.conf.CELERY_TASK_SERIALIZER = 'json'
如果你一次性有许多需要配置,则可以通过update()方法实现:
app.conf.update(
CELERY_TASK_SERIALIZER='json',
CELERY_ACCEPT_CONTENT=['json'], # Ignore other content
CELERY_RESULT_SERIALIZER='json',
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENABLE_UTC=True,
) 你也可以通过app.config_from_object() method告诉Celery通过一个模块来生成configuration: app.config_from_object('celeryconfig') 这个模块通常叫做 celeryconfig,但实际上你可以叫任何名字。
$ cat celeryconfig.py
CELERY_ROUTES = {'tasks.add': 'low-priority', 'tasks.add': {'rate_limit': '10/m'} 8.Where to go from here
如果你想了解更多请阅读: http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#next-steps
之后阅读: http://docs.celeryproject.org/en/latest/userguide/index.html#guide

【理论】python使用celery异步处理请求的更多相关文章

  1. 【Python】Celery异步处理

    参考:http://www.cnblogs.com/znicy/p/5626040.html 参考:http://www.weiguda.com/blog/73/ 参考:http://blog.csd ...

  2. python—Celery异步分布式

    python—Celery异步分布式 Celery  是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...

  3. python 关于celery的异步任务队列的基本使用(celery+redis)【无配置文件设置】

    环境说明: window7 X64 python 2.7.6 .celery 3.1.25.redis 2.10.6 本地安装的redis服务端版本号:Redis-x64-3.2.100 工程结构说明 ...

  4. python 关于celery的异步任务队列的基本使用(celery+redis)【采用配置文件设置】

    工程结构说明:源文件下载请访问https://i.cnblogs.com/Files.aspx __init__.py:实例化celery,并加载配置模块 celeryconfig.py:配置模块 t ...

  5. Django --- celery异步任务与RabbitMQ模块

    一 RabbitMQ 和 celery 1 celery Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务, ...

  6. celery异步任务、定时任务

    阅读目录 一 什么是Celery? 二 Celery的使用场景 三 Celery的安装配置 四 Celery异步任务 五Celery定时任务 六在Django中使用Celery   一 什么是Cele ...

  7. celery异步发送邮件

    利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决 首先我们来看一下邮件发送的过程: Django网站先发送到 ...

  8. Django使用Celery异步任务队列

    1  Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收 ...

  9. Python之celery的简介与使用

    celery的简介   celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能 ...

随机推荐

  1. ibatis.net 实现多数据库配置

    1.1  功能介绍 使用ibatis.net ORM框架时,有时候需要操作多个数据库,同时有时候也需要对连接数据库信息进行加密,本文通过将配置连接写到Web.config中, 这样就可以在Web.co ...

  2. PowerDesigner16工具学习笔记-建立BPM

    根据不同用途,BPM分为分析性(Analysis).执行型(Executable)和协作型(Collaborative) BPM的类型 业务流程语言 描述  分析型  Analysis  提供流程层次 ...

  3. VAE--就是AutoEncoder的编码输出服从正态分布

    花式解释AutoEncoder与VAE 什么是自动编码器 自动编码器(AutoEncoder)最开始作为一种数据的压缩方法,其特点有: 1)跟数据相关程度很高,这意味着自动编码器只能压缩与训练数据相似 ...

  4. JS类型转换之valueOf和toString详解

    最近群里有人发了下面这题: 实现一个函数,运算结果可以满足如下预期结果: add(1)(2)// 3 add(1,2,3)(10)// 16 add(1)(2)(3)(4)(5)// 15 对于一个好 ...

  5. myeclipse10修改全局jsp编码格式为gbk

    myeclipse10修改全局jsp编码格式为gbk: window->prefenrence->general->content types->  展开:text->j ...

  6. SublimeText实用快捷键

    Markdown Ctrl+Alt+O: Preview Markup in Browser Ctrl+Alt+X: Export Markup as HTML Ctrl+Alt+C: Copy Ma ...

  7. 《转》深入理解Activity启动流程(一)–Activity启动的概要流程

    本文原创作者:Cloud Chou. 原文地址:http://www.cloudchou.com/android/post-788.html Android中启动某个Activity,将先启动Acti ...

  8. oracle创建触发器

    create or replace trigger 触发器名字 触发时间 触发事件 after(before)  insert or update or delete on 表名 for each r ...

  9. timer Compliant Controller project (3)--bom and sch

    After optimization of structural solution , I  must prepare the bom and  drawing circuit diagram as ...

  10. HDU3335 Divisibility Dilworth定理+最小路径覆盖

    首先需要一些概念: 有向图,最小路径覆盖,最大独立集,Dilworth,偏序集,跳舞链(DLX).... 理解一: 对于DAG图,有:最大独立集=点-二分匹配数,二分匹配数=最小路径覆盖. 而无向图, ...