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. 谈一谈手机WebApp的fixed属性(手机上的固定栏)【转】

    1.iphone/android原生app常见结构 似乎,所有的手机应用,都遵循这样的布局:固定的顶部+固定的底部+可滚动在中间区域.这种“雷同”的模式让人恶心,却不得不承认这是一种很规矩却又很实用的 ...

  2. Redis集群搭建笔记

    系统为CentOS7,创建9001-9006 6个文件夹,复制 redis-server redis.conf 文件到6个新文件夹下 redis.conf文件配置如下: port 9001 daemo ...

  3. New Concept English Two 17 43

    $课文41  你把那个叫帽子吗? 422. 'Do you call that a hat?' I said to my wife. “你把那个叫帽子吗?”我对妻子说. 423. 'You needn ...

  4. PyalgoTrade 交易(五)

    我们继续采取简单的策略,这次模拟实际交易.这个想法很简单: 如果调整后的收盘价高于SMA(15),我们将进入多头仓位(我们下单买入市价). 如果调整后的收盘价低于SMA(15),我们退出多头头寸(我们 ...

  5. 滑动平均线的notebook画法

    滑动平均线,本程序解决了如何在matplotlib中使用中文显示,环境python2.7 最好使用 anaconda 环境使用sns似使得图片更加美观,不多说,上代码 import tushare a ...

  6. Java中private、protected、public和default的区别 (转)

    本文内容转载自: https://www.cnblogs.com/jingmengxintang/p/5898900.html public: 具有最大的访问权限,可以访问任何一个在classpath ...

  7. [笔记] linux中的计划任务crontab

    不能拒绝进步 cron来源于希腊单词chronos(意为"时间"),指linux系统下一个自动执行指定任务的程序(计划任务). 1--crontab 的命令选项 #crontab ...

  8. 在服务器上运行db:seed数据填充时,出错的问题解决

    在服务器上运行db:seed数据填充时,出错的问题解决 运行composer  dump-autoload

  9. Scriptcase v8推出内部測试版及价格调整

    PHP代码生成器Scriptcase如今已经内部推出了v8.0版本号,8.0相比于曾经的版本号做了大幅度调整.我们将在完好測试的基础上发表8.0的相关文章. 另,即日起,Scriptcase的20%优 ...

  10. 5.Appium+真机Demo

    1.连接真机后,执行代码时出现错误:A new session could not be created. (Original error: Could not extract PIDs from p ...