Celery学习---Celery 分布式队列介绍及安装
Celery介绍和基本使用
Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:
1. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。
2. 你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福
【简单讲:异步 + 定时】
Celery有以下优点
1. 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
2. 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
3. 快速:一个单进程的celery每分钟可处理上百万个任务
4. 灵活: 几乎celery的各个组件都可以被扩展及自定制
Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis
Celery是一个上层任务,当有用户请求到来的时候,发送一个任务给celery,这个任务会被中间件Redis/RabbitMQ接收发送给Celery的节点去执行任务,有一个好处就是可以横向的扩展机器去执行任务。
Celery安装使用
Celery安装使用
Celery的默认broker[可理解为中间件Redis/RabbitMQ]是RabbitMQ, 仅需配置一行就可以
broker_url = 'amqp://guest:guest@localhost:5672//'
rabbitMQ 没装的话请装一下,安装看这里 http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#id3
使用Redis做broker也可以
安装redis组件
pip install -U "celery[redis]"
配置
Configuration is easy, just configure the location of your Redis database:
app.conf.broker_url = 'redis://localhost:6379/0'
Where the URL is in the format of:【如果中间件有认证操作】
redis://:password@hostname:port/db_number
all fields after the scheme are optional, and will default to localhost on port 6379, using database 0. 如果想获取每个任务的执行结果,还需要配置一下把任务结果存在哪
If you also want to store the state and return values of tasks in Redis, you should configure these settings:
app.conf.result_backend = 'redis://localhost:6379/0'
Celery的基本操作+异步使用
Win7下安装celery模块
pip3 install celery


[测试发现celery安装完成后Win7的cmd可以用celery,不需要添加]
如果需要手动添加,则找到celery的安装路径,写入Win7的path里即可。
E:\PyCharm 2017.2.4\Python3.2.5\Lib\site-packages\celery\bin\
Ubuntu下安装
首先安装pip3
sudo apt-get install python3-pip

安装Celery
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple celery

Ubuntu下安装成功

Ubuntu下运行报错,缺少Redis
运行Celery任务后报错
ImportError: Missing redis library (pip install redis)

安装Redis连接模块:
pip3 install redis

启动Celery Worker来开始监听并执行任务
celery -A Celery的Py文件名 worker --loglevel=info
后台Celery任务的运行
操作前期条件: 安装并启动Redis
myCelery.py
from celery import Celery
# 定义了一个Celery的App
app = Celery('tasks',
broker='redis://192.168.2.105', # Celery和用户请求的中间代理
backend='redis://192.168.2.105') # 接收Celery返回结果的 @app.task # 函数变成一个Celery的任务,调用celery实现异步任务
def add(x, y):
print("running...", x, y)
return x + y
运行:
celery -A myCelery worker --loglevel=info 【写文件名称即可】
运行结果[Win]

运行结果[Linux]

注: celery文件运行起来后只能接收和执行任务[等待任务状态...],还需要用户发送任务
前台Celery任务的发布
Linux下发布任务
进入文件所在的路径下
omc@omc-virtual-machine:~/Celery$ cd /home/omc/Celery
进入Python环境
omc@omc-virtual-machine:~/Celery$ python

在Python环境下导入文件的函数
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from myCelery import add
>>> add.delay(100,100)
<AsyncResult: 22631adf-e54f-4718-99a1-1e76b5c1575f>
>>> add(100,300)
running... 100 300
400

注:中间件Redis只负责存储了中间的消息
打开Redis查看存储的消息内容
omc@omc-virtual-machine:~$ redis-cli

127.0.0.1:6379> get celery-task-meta-ebad12b8-d4ff-461b-b6e5-0dab4eaba855


>>> r = add.delay(20,20000)
>>> r.

>>> r.get()
20020

返回对象的其他方法的使用:
>>> r = cmd_Celery.my_cmd.delay("df -h")
The ready() method returns whether the task has finished processing or not:
>>> r.ready()
False
You can wait for the r to complete, but this is rarely used since it turns the asynchronous call into a synchronous one:
>>> r.get(timeout=1) # 设置超时时间
8
In case the task raised an exception, get() will re-raise the exception, but you can override this by specifying the propagate argument:
>>> r.get(propagate=False) # propagate 扩展,添加propagate后会对报错进行格式化输出
If the task raised an exception you can also gain access to the original traceback:
>>> r.traceback # 报错调试用
…
当Celery有多个worker的时候[默认是随机分配的]:
前台发布:

后台有2个Celery的worker
work1:

Work2:

Celery异步执行命令
操作前期条件: 安装并启动Redis
cmd_Celery.py
from celery import Celery
# 定义了一个Celery的App
app = Celery('tasks',
broker='redis://192.168.2.105',
# redis://:password@hostname:port/db_number 有密码认证的连接
# broker='redis://:密码@192.168.2.105:6379/0',
backend='redis://192.168.2.105') # 接收Celery返回结果的 # 函数变成一个Celery的任务,调用celery实现异步任务
import subprocess
import time
@app.task
def my_cmd(cmd):
print('Celery of CMD:', cmd)
time.sleep(5) # 判断是否是异步的标志,会卡5秒后执行cmd的命令
cmd_obj = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return cmd_obj.stdout.read().decode("utf-8") # 返回结果必须是可JSON的,需要编码
后台启动Celery任务:
omc@omc-virtual-machine:~/Celery$ celery -A cmd_Celery worker --loglevel=debug

前台客户端发送命令:
>>> python3
>>> import cmd_Celery
>>> r = cmd_Celery.my_cmd.delay("df -h")
>>> r.get()

后台Celery服务器端执行任务:

如果返回结果不是可JSON会报错:
默认返回的是byte类型的,需要进行解码

后台Celery的终止
2次Ctrl+C

后台启动/停止多个Celery的worker
前台启动命令: celery -A 项目名worker -loglevel=info 后台启动命令: celery multi start w1 -A 项目名 -l info 后台重启命令: celery multi start w1 -A 项目名 -l info 后台停止命令: celery multi stop w1 -A 项目名 -l info 前后台的区别: 后台是mult启动
Celery学习---Celery 分布式队列介绍及安装的更多相关文章
- Elasticsearch 6.x版本全文检索学习之分布式特性介绍
1.Elasticsearch 6.x版本全文检索学习之分布式特性介绍. 1).Elasticsearch支持集群默认,是一个分布式系统,其好处主要有两个. a.增大系统容量,如内存.磁盘.使得es集 ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- InterSystems Ensemble学习笔记(一) Ensemble介绍及安装
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
- MeayunDB学习笔记(一) MeayunDB介绍及安装
系列目录 MeayunDB介绍-高性能分布式内存数据库 MeayunDB学习笔记(一)MeayunDB介绍及安装 MeayunDB学习笔记(二)批量导入数据 MeayunDB学习笔记(三)索引应用 ...
- ActiveMQ学习教程/1.简要介绍与安装
ActiveMQ学习教程(一)——简要介绍与安装 一.名词: 1.JMS:即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的 ...
- Celery学习---Celery 与django结合实现计划任务功能
项目的目录结构: 项目前提: 安装并启动Redis 安装Django和Celery的定时任务插件 安装方法一: pip直接安装[安装了pip的前提下] omc@omc-virtual-machine: ...
- Celery学习--- Celery 最佳实践之与django结合实现异步任务
django 可以轻松跟celery结合实现异步任务,只需简单配置即可 同步执行和异步执行 注意:即使Celery的任务没有执行完成,但是已经创建了任务ID.可以利用前台的定时任务发送Ajax异步请求 ...
- Celery学习--- Celery操作之定时任务
celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat 文件定时执行任务 项目前提: 安装并启动Redis celery_Sche ...
- Celery学习--- Celery在项目中的使用
可以把celery配置成一个应用,注意连接文件命名必须为celery.py 目录格式如下 项目前提: 安装并启动Redis CeleryPro/celery.py [命名必须为celery.py] ...
随机推荐
- 剑指offer64:滑动窗口的最大值
题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4, ...
- SpringMVC源码阅读:视图解析器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- [PKUWC 2018]随机算法
Description 题库链接 给定一张有 \(n\) 个点 \(m\) 条边的无向图,生成 \(1\sim n\) 的全排列,假设一个排列是 \(p\) , \(S\) 是当前最大独立集:如果 \ ...
- SQL Server提取字段中的所有数字
今天公司项目中遇到了一个需求,要求提取用户电话号码字段中的所有电话信息. 由于该字段在项目最初设计中没有严格控制数据质量,导致用户在输入时包含了很多非电话的信息,如用户名字等(136 **** *** ...
- 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)
这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...
- Spring Boot统一异常处理方案示例
一.异常处理的原则 1.调用方法的时候返回布尔值来代替返回null,这样可以 NullPointerException.由于空指针是java异常里最恶心的异常. 2. catch块里别不写代码.空ca ...
- AGC009:Eternal Average
传送门 好神啊 直接考虑一棵 \(n+m\) 个叶子的 \(k\) 叉树,根结点权值为 \(\sum_{i\in m}(\frac{1}{k})^{deep_i}\) 对于一个 \(deep\) 的序 ...
- JS全局变量VAR和THIS--在函数内部,加var是局部变量,不加是全局变量
JS全局变量VAR和THIS 2011-05-23 21:43 很多人都觉得在JavaScript声明一个变量,加var和不加var没有什么区别,实际上是一个错误的观点,如果在函数外面,也就是说在wi ...
- marquee 标签的使用介绍
marquee 实现滚动效果(创建滚动的文本字幕) 1.marquee 支持的属性: (1).behavior设置滚动方式: <marquee behavior="alternate& ...
- p2p状态码
因为需要的确定状态太多,减少数据库的压力,采取二进制表示状态码 状态码工具类 package com.xmg.p2p.base.util; /** * 用户状态类,记录用户在平台使用系统中所有的状态. ...