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. tp5集成淘宝,微信,网易,新浪等第三方登录

    tp5集成淘宝,微信,网易,新浪等第三方登录 一.总结 一句话总结: 接口 链接 实现的话就是这些平台给的一个接口(链接),你通过这些接口登录进去之后,它会给你返回用户名,头像之类的信息,我们的网站存 ...

  2. 谈谈WPF中的CollectionView与CollectionViewSource

    https://www.cnblogs.com/zhouyinhui/archive/2007/12/07/987076.html

  3. Python 实现图片上表格的写入

    直接上代码:import matplotlib.pylab as pltimport numpy as npplt.figure()axes=plt.gca()y= np.random.randn(9 ...

  4. 带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析

    前言 集成ijkplayer,需要执行脚本init-ios.sh,那么init-ios.sh脚本干嘛用的了,花了半天时间,学习了下shell脚本,感觉脚本语言学起来还是比较容易上手的,现在仅仅能看懂了 ...

  5. 安装MySQL后要做的事

    安装MySQL后要修改的配置 [mysql] default-character-set=utf8 [mysqld] # 关闭域名反解 skip_name_resolve # 每表一个独立的表空间文件 ...

  6. java-IO-基本输出输入流

    / 标准输入输出流: 直接类名调用 一经创建无法改变 public static final PrintStream err “标准”错误输出流. public static final InputS ...

  7. vue.js 源代码学习笔记 ----- html-parse.js

    /** * Not type-checking this file because it's mostly vendor code. */ /*! * HTML Parser By John Resi ...

  8. php中require_once与include_once的区别

    首先include_once仅包含文件一次,如果没有文件,会发出警告,并继续执行. 而require_once也是仅包含文件一次,但是如果程序中没有找到文件,则程序会中止执行.

  9. BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)

    4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 359  Solved: 205[Submit][Stat ...

  10. pe如何安装ios系统

    1.进PE系统(老毛桃) 2.虚拟光驱加载ios系统 3.然后打开我的电脑,里面有个光盘,就像光盘插在光驱里打开电脑后的样子,双击安装系统.