一、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. Hibernate 基于主键的一对一关联关系随手记

    @Test public void testSave() { Boss boss = new Boss(); boss.setName("A-老板"); Company compa ...

  2. Django应用的打包和应用的安装和卸载

    将应用打包需要安装: setuptools 安装和卸载应用需要安装: pip 举例polls是一个应用包. polls文件夹中包含所有有关应用的文件. 打包应用: 首先,在你的Django项目之外,为 ...

  3. BZOJ4887:[TJOI2017]可乐(矩阵乘法)

    Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市,自爆. ...

  4. Html5的本地储存 Web Storage

      Html5 中的存储包括两种:sessionStorage 和 localStorage   sessionStorage 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话 ...

  5. MyBatis(8)延迟加载&缓存

    什么是延迟加载? resultMap可以实现高级映射,association,collection具有延迟加载的功能.   当我们需要查询某个信息的时候,再去查询,达到按需查询,就是延迟加载   可以 ...

  6. linq 和lamba表达式

    一.什么是Linq(what)二.Linq的优点(why)三.Linq查询的步骤(how)四.查询基本操作五.結合實例代碼(具體聯繫用linqtosql來寫的增刪改查)一.什么是Linq(what). ...

  7. .net 基础(一)

    方法 只需要考虑2个 东西 1. 方法的参数  2.方法的返回值 当参数的个数不确定的时候,可以采用可变参数params. params 数组的 个数,不确定.当传入的 参数为空的时候,可变参数的数组 ...

  8. 【转】Nginx反向代理转发tomcat

    http://blog.csdn.net/mlc1218559742/article/details/53117520 最近刚接触nginx,在网上查阅了相关资料,看到最多的形容nginx的词就是反向 ...

  9. Tomcat生命周期

    来源 本文整理自 <Tomcat内核设计剖析>.<Tomcat结构解析> Lifecycle接口 ​ Lifecycle接口统一管理Tomcat生命周期.一共做了4件事: 定义 ...

  10. asp.net mvc HtmlHelperExt EnumDropDownList

    public static class HtmlHelperExt { public static MvcHtmlString EnumDropDownList<TEnum>(this H ...