一、celery简介

  Celery是一个Python开发的异步分布式任务调度模块。celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, 数据库等。

  broker是一个消息传输的中间件,可以理解为一个邮箱。每当应用程序调用celery的异步任务的时候,会向broker传递消息,而后celery的worker将会取到消息,进行对于的程序执行。好吧,这个邮箱可以看成是一个消息队列。那么什么又是backend,通常程序发送的消息,发完就完了,可能都不知道对方时候接受了。为此,celery实现了一个backend,用于存储这些消息以及celery执行的一些消息和结果。对于 brokers,官方推荐是rabbitmq和redis,至于backend,就是数据库啦。为了简单起见,我们都用redis。

  redis连接URL的格式为:

  redis://password@hostname:port/db_number

二、celery小例子

  1.在Linux上要先启动redis(./redis-server &)。

  2.程序代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time :2017/12/19 15:12
# @Author :huangdongju
# @File :17-2.py from celery import Celery broker = "redis://192.168.203.12:6379/5" #5代表第五个数据库
backend = "redis://192.168.203.12:6379/6"
app = Celery("17-2",broker=broker,backend=backend) @app.task #注册到任务中去
def add(x,y):
return x + y re = add.delay(10,20)
print (re.result)
print (re.ready)
print (re.get(timeout = 1))
print (re.status)

  3.将worker放置在Linux上,在Linux上进行如下配置(Python的版本至少为2.7.0以上)。

  # pip install redis

  # pip install celery

  # cd /usr/local/src

  # mkdir celery

  # cd celery

  # vim 17-2.py  (要与之前的文件名相同)

  # celery -A 17-2 worker - l info

4.结果

 在Linux上输出的日志为:

三、celery多实例

  celery可以支持多台不通的计算机执行不同的任务或相同的任务。如果要说celery的分布式应用的的话,那就是celery的消息路由机制,就要提一下AMQP协议。具体的可以查看AMQP文档。简单来说就是可以有多个消息队列(Message Queue),不同的消息可以指定发给不同的Message Queue,而这是通过Exchange来实现的。发送消息到Message Queue中时,可以指定routing key ,Exchange通过routing key来把消息路由(routes)到不同的Message Queue中去。实例代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time :2017/12/20 16:19
# @Author :huangdongju
# @File :demon3.py
import time
from celery import Celery app = Celery()
app.config_from_object("celeryconfig") @app.task
def taskA(x,y):
return x*y @app.task
def taskB(x,y,z):
return x+y+z @app.task
def add(x,y):
return x+y #!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time :2017/12/20 9:44
# @Author :huangdongju
# @File :celeryconfig.py
from kombu import Queue, Exchange BROKER_URL = "redis://192.168.203.12:6379/1"
CELERY_RESULT_BACKEND = "redis://192.168.203.12:6379/2" #要大写 CELERY_QUEUES = { #配置消息队列
Queue("default",Exchange("default"),routing_key = "default"),
Queue("for_task_A",Exchange("for_task_A"),routing_key = "for_task_A"),
Queue("for_task_B",Exchange("for_task_B"),routing_key = "for_task_B") } CELERY_ROUTES ={
"demon3.taskA":{"queue":"for_task_A","routing_key":"for_task_A"},
"demon3.taskB":{"queue":"for_task_B","routing_key":"for_task_B"}
}

  在服务器上要同步demon3.py与celeryconfig.py这两个文件。然后打开两个进程:

celery -A demon3 worker -l info -n workerA.%h -Q for_task_A

celery -A demon3 worker -l info -n workerB.%h -Q for_task_B

结果如下:

200
SUCCESS
6
SUCCESS
None
PENDING

  在上述结果中,看到状态有为PENDING,表示没有执行,这是因为没有celeryconfig.py文件中指定改route到哪一个Queue中,所以会被发动到默认的名字celery的Queue中,但是我们还没有启动worker执行celery中的任务。

四、celery与定时任务

  在celery中执行定时任务非常简单,只需要设置celery对象中的CELERY_SCHEDULE变量。实例代码为:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time :2017/12/20 16:19
# @Author :huangdongju
# @File :demon3.py
import time
from celery import Celery app = Celery()
app.config_from_object("celeryconfig") @app.task
def taskA(x,y):
return x*y @app.task
def taskB(x,y,z):
return x+y+z @app.task
def add(x,y):
return x+y
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time :2017/12/20 9:44
# @Author :huangdongju
# @File :celeryconfig.py
from kombu import Queue, Exchange BROKER_URL = "redis://192.168.203.12:6379/1"
CELERY_RESULT_BACKEND = "redis://192.168.203.12:6379/2" #要大写 CELERY_QUEUES = { #配置消息队列
Queue("default",Exchange("default"),routing_key = "default"),
Queue("for_task_A",Exchange("for_task_A"),routing_key = "for_task_A"),
Queue("for_task_B",Exchange("for_task_B"),routing_key = "for_task_B") } CELERY_ROUTES ={
"demon3.taskA":{"queue":"for_task_A","routing_key":"for_task_A"},
"demon3.taskB":{"queue":"for_task_B","routing_key":"for_task_B"}
} #定时任务
CELERY_TIMEZONE = 'UTC'
CELERY_SCHEDULE = {
'taskA_schedule':{
'task':'demon3.taskA',
'schedule':20,
'args':(5,6)
}, 'taskB_schedule':{
'task':'demon3.taskB',
'schedule':50,
'args':(100,200,300)
}, 'add_schedule':{
'task':'demon3.add',
'schedule':10,
'args':(110,120)
},
}

Python之celery的更多相关文章

  1. 【理论】python使用celery异步处理请求

    Flask中使用celery队列处理执行时间较长的请求. 一. 安装celery pip install celery flask redis 二. celery简介 Celery是个异步分布式任务队 ...

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

    工程结构沿用https://www.cnblogs.com/apple2016/p/11422388.html,只需修改celeryconfig.py文件即可: 1.更新celeyconfig.py文 ...

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

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

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

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

  5. 【Python】Celery异步处理

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

  6. Python 任务队列 Celery

    一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...

  7. python之celery的使用(一)

    前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...

  8. Python之celery的简介与使用

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

  9. Python中Celery 的基本用法以及Django 结合 Celery 的使用和实时监控进程

    celery是什么 1 celery是一个简单,灵活且可靠的,处理大量消息的分布式系统 2 专注于实时处理的异步任务队列 3 同时也支持任务调度 执行流程 Celery 基本使用 tasks.py i ...

  10. python之celery使用详解一

    前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...

随机推荐

  1. JavaScript的DOM_节点类型的扩展

    DOM 自身存在很多类型,比如 Element 类型(元素节点)再比如 Text 类型(文本节点).DOM 还提供了一些扩展功能. 一.Node类型 Node 接口是 DOM1 级就定义了,Node ...

  2. HTML5 classList API

    Having thrust myself into the world of JavaScript and JavaScript Libraries, I've often wondered: Whe ...

  3. 安装JDK8

    安装JDK8 1.去http://www.Oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html中下载JDK的 ...

  4. MongoDB的角色作用(1)

    MongoDB的角色作用: 经过大量血的教训,一个分片配置两个副本集时(一个是primary一个是secondary),如果primary挂掉,secondary是不会升级的,必须要加上一个不存储数据 ...

  5. PAT——1009. 说反话

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区 ...

  6. PAT——1001 害死人不偿命的(3n+1)猜想 (15)

    对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1? 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值. 输出格式:输出从n计算到1需要的步数. 输入样例 ...

  7. The App Life Cycle & The Main Function

    The App Life Cycle Apps are a sophisticated interplay between your custom code and the system framew ...

  8. HTML5零散知识点总结

    1.产生ioc图标的网站: http://www.bitbug.net/ 链接ioc图标: <link rel="shortcut icon" type="imag ...

  9. hadoop-2.2.0 HA配置

    采用的是4台真实机器: namenode:qzhong  node27 datanode:qzhong node27 node100 node101 操作系统环境:qzhong(Ubuntu-14.0 ...

  10. 微信小程序获取手机信息

    wx.getSystemInfo({ success: function (res) { console.log(res.model)//手机型号 console.log(res.pixelRatio ...