Python之celery
一、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的更多相关文章
- 【理论】python使用celery异步处理请求
Flask中使用celery队列处理执行时间较长的请求. 一. 安装celery pip install celery flask redis 二. celery简介 Celery是个异步分布式任务队 ...
- python 关于celery的定时任务队列的基本使用(celery+redis)【采用配置文件设置】
工程结构沿用https://www.cnblogs.com/apple2016/p/11422388.html,只需修改celeryconfig.py文件即可: 1.更新celeyconfig.py文 ...
- python 关于celery的异步任务队列的基本使用(celery+redis)【采用配置文件设置】
工程结构说明:源文件下载请访问https://i.cnblogs.com/Files.aspx __init__.py:实例化celery,并加载配置模块 celeryconfig.py:配置模块 t ...
- python 关于celery的异步任务队列的基本使用(celery+redis)【无配置文件设置】
环境说明: window7 X64 python 2.7.6 .celery 3.1.25.redis 2.10.6 本地安装的redis服务端版本号:Redis-x64-3.2.100 工程结构说明 ...
- 【Python】Celery异步处理
参考:http://www.cnblogs.com/znicy/p/5626040.html 参考:http://www.weiguda.com/blog/73/ 参考:http://blog.csd ...
- Python 任务队列 Celery
一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...
- python之celery的使用(一)
前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...
- Python之celery的简介与使用
celery的简介 celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能 ...
- Python中Celery 的基本用法以及Django 结合 Celery 的使用和实时监控进程
celery是什么 1 celery是一个简单,灵活且可靠的,处理大量消息的分布式系统 2 专注于实时处理的异步任务队列 3 同时也支持任务调度 执行流程 Celery 基本使用 tasks.py i ...
- python之celery使用详解一
前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...
随机推荐
- Webpack笔记(二)——搭建React开发环境
前几天一直在学习webpack,总算比之前学习的时候有了点收获,所以在昨天发布了一篇webpack入门笔记,今天继续使用webpack练了练手,搭建了一个React开发环境,如果还不熟悉的童鞋可以看一 ...
- Tomcat的webapps目录下的classes文件夹下缺失编译好的.class文件原因及其解决方法
右键,选择BuildPath: 可以编辑Output folder,指定编译后的文件的存放目录,一般是target/classes目录
- springMVC文件上传大小超过限制的问题
[转自]https://my.oschina.net/ironwill/blog/646762 springMVC是一个非常方便的web层框架,我们使用它的文件上传也非常的方便. 我们通过下面的配置来 ...
- T-sql中的三种分页查询
USE [APS_Future_FT] GO /****** Object: StoredProcedure [dbo].[A_PagingAndSorting] Script Date: 2013/ ...
- Ajax实例一:利用服务器计算
Ajax实例一:利用服务器计算 HTML代码 //输入两个数 <input id="number1" type="number"> <inpu ...
- springboot集成swagger2构建RESTful API文档
在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...
- mybatis分页PageHelper插件的使用
1.jar包, 2.改mybatis的配置文件,加上这段配置: <plugins><plugin interceptor="com.github.pagehelper.Pa ...
- Spring通过注解装配Bean
通过注解实现ServiceImpl业务 一.使用@Component装配Bean 1. 定义类:User 在类上面加@Component注解,在属性上面加@Value值 package com.wbg ...
- java中常见的math方法
java.lang.Math : 绝对值: static int abs(int a) static long abs(long a) static float abs(float a) s ...
- Android平台上PMEM的使用及Platform设备注册(二)
三.注册PMEM设备 这里我们除了描述PMEM设备,还将注册一个拥有memory空间和IRQ资源的示例设备example_device. 对于example_device,定义如下结构体: stati ...