详解Python Celery和RabbitMQ实战教程


Posted in Python onJanuary 20, 2021

前言

Celery是一个异步任务队列。它可以用于需要异步运行的任何内容。RabbitMQ是Celery广泛使用的消息代理。在本这篇文章中,我将使用RabbitMQ来介绍Celery的基本概念,然后为一个小型演示项目设置Celery 。最后,设置一个Celery Web控制台来监视我的任务

基本概念

  来!看图说话:

详解Python Celery和RabbitMQ实战教程

Broker
Broker(RabbitMQ)负责创建任务队列,根据一些路由规则将任务分派到任务队列,然后将任务从任务队列交付给worker

Consumer (Celery Workers)
Consumer是执行任务的一个或多个Celery workers。可以根据用例启动许多workers

Result Backend
后端用于存储任务的结果。但是,它不是必需的元素,如果不在设置中包含它,就无法访问任务的结果

安装Celery

  首先,需要安装好Celery,可以使用PyPI:

pip install celery

选择一个Broker:RabbitMQ

  为什么我们需要broker呢?这是因为Celery本身并不构造消息队列,所以它需要一个额外的消息传输来完成这项工作。这里可以将Celery看作消息代理的包装器

实际上,也可以从几个不同的代理中进行选择,比如RabbitMQ、Redis或数据库(例如Django数据库)

在这里使用RabbitMQ作为代理,因为它功能完整、稳定,Celery推荐使用它。由于演示我的环境是在Mac OS中,安装RabbitMQ使用Homebrew即可:

brew install rabbitmq
#如果是Ubuntu的话使用apt-get安装

启动RabbitMQ

  程序将在/usr/local/sbin中安装RabbitMQ,虽然有些系统可能会有所不同。可以将此路径添加到环境变量路径,以便以后方便地使用。例如,打开shell启动文件~/.bash_profile添加:

PATH=$PATH:/usr/local/sbin

现在,可以使用rabbitmq-server命令启动我们的RabbitMQ服务器。检查RabbitMQ服务器成功启动,将看到类似的输出:

详解Python Celery和RabbitMQ实战教程

为Celery配置RabbitMQ

  RabbitMQ使用Celery之前,需要对RabbitMQ进行一些配置。简单地说,我们需要创建一个虚拟主机和用户,然后设置用户权限,以便它可以访问虚拟主机

# 添加用户跟密码
$ rabbitmqctl add_user test test123
# 添加虚拟主机
$ rabbitmqctl add_vhost test_vhost
# 为用户添加标签
$ rabbitmqctl set_user_tags test test_tag
# 设置用户权限
$ rabbitmqctl set_permissions -p test_vhost test ".*" ".*" ".*"

敲黑板!RabbitMQ中有三种操作:配置、写入和读取

上面命令末尾的字符串表示用户test将拥有所有配置、写入和读取权限

演示项目

现在让我们创建一个简单的项目来演示Celery的使用

详解Python Celery和RabbitMQ实战教程

celery.py中添加以下代码:

from __future__ import absolute_import
from celery import Celery

app = Celery('test_celery',
broker='amqp://test:test123@localhost/test_vhost',
backend='rpc://',
include=['test_celery.tasks'])

在这里,初始化了一个名为app的Celery实例,将用于创建一个任务。Celery的第一个参数只是项目包的名称,即“test_celery”。

broker参数指定代理URL,对于RabbitMQ,传输是amqp。

后端参数指定后端URL。Celery中的后端用于存储任务结果。因此,如果需要在任务完成时访问任务的结果,应该为Celery设置一个后端。

rpc意味着将结果作为AMQP消息发送回去,这对本次演示来说是一种可接受的格式

include参数指定了在Celery工作程序启动时要导入的模块列表。我们在这里添加了tasks模块,以便找到我们的任务。

tasks.py这个文件中,定义了我们的任务add_longtime:

from __future__ import absolute_import
from test_celery.celery import app
import time

@app.task
def add_longtime(a, b):
  print 'long time task begins'
  # sleep 5 seconds
  time.sleep(5)
  print 'long time task finished'
  return a + b

可以看到,导入了在前面的Celery模块中定义的应用程序,并将其用作任务方法的装饰器。另外注意!app.task只是一个装饰器。此外,我们在add_longtime任务中休眠5秒,以模拟一个耗时较长的Task

在设置好Celery之后,我们需要开始运行任务,它包含在runs_tasks.py:

from .tasks import add_longtime
import time

if __name__ == '__main__':
  result = add_longtime.delay(1,2)
	#此时,任务还未完成,它将返回False
  print 'Task finished? ', result.ready()
  print 'Task result: ', result.result
  # 延长到10秒以确保任务已经完成
  time.sleep(10)
  # 现在任务完成,ready方法将返回True
  print 'Task finished? ', result.ready()
  print 'Task result: ', result.result

这里,我们使用delay方法调用任务add_longtime,如果我们想异步处理任务,就需要使用delay方法。此外,保存任务的结果并打印一些信息。如果任务已经完成,ready方法将返回True,否则返回False。result属性是任务的结果,如果任务尚未完成,则返回None。

启动Celery

现在,可以使用下面的命令启动Celery(注:在项目文件夹中运行):

celery -A test_celery worker --loglevel=info

Celery成功连接到RabbitMQ,你会看到这样的东西:

详解Python Celery和RabbitMQ实战教程

运行任务

再项目文件中输入以下命令运行它:

python -m test_celery.run_tasks

查看Celery控制台,看到运行任务:

[2020-05-15 17:15:21,508: INFO/MainProcess]
Received task: test_celery.tasks.add_longtime[25ba9c87-69a7-4383-b983-1cefdb32f8b3]
[2020-05-15 17:15:21,508: WARNING/Worker-3] long time task begins
[2020-05-15 17:15:31,510: WARNING/Worker-3] long time task finished
[2020-05-15 17:15:31,512: INFO/MainProcess]
Task test_celery.tasks.add_longtime[25ba9c87-69a7-4383-b983-1cefdb32f8b3] succeeded in 15.003732774s: 3

当Celery收到一个任务,它打印出任务名称与任务id(在括号中):

Received task: test_celery.tasks.add_longtime[7d942984-8ea6-4e4d-8097-225616f797d5]

在这一行下面是我们的任务add_longtime打印的两行,时间延迟为5秒:

long time task begins
long time task finished

最后一行显示我们的任务在5秒内完成,任务结果为3:

Task test_celery.tasks.add_longtime[7d942984-8ea6-4e4d-8097-225616f797d5] succeeded in 5.025242167s: 3

在当前控制台中,您将看到以下输出:

详解Python Celery和RabbitMQ实战教程

实时监控Celery

Flower是一款基于网络的Celery实时监控软件。使用Flower,可以轻松地监视任务进度和历史记录

使用pip来安装Flower:

pip install flower

要启动Flower web控制台,需要运行以下命令:

celery -A test_celery flower

Flower将运行具有默认端口5555的服务器,可以通过http://localhost:5555访问web控制台

详解Python Celery和RabbitMQ实战教程

到此这篇关于详解Python Celery和RabbitMQ实战教程的文章就介绍到这了,更多相关Python Celery和RabbitMQ实战内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Python聚类算法之凝聚层次聚类实例分析
Nov 20 Python
Python中scatter函数参数及用法详解
Nov 08 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
python3使用matplotlib绘制散点图
Mar 19 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 Python
详解python3类型注释annotations实用案例
Jan 20 #Python
python-jwt用户认证食用教学的实现方法
Jan 19 #Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 #Python
python 自动识别并连接串口的实现
Jan 19 #Python
python爬取抖音视频的实例分析
Jan 19 #Python
python中的插入排序的简单用法
Jan 19 #Python
Python实现淘宝秒杀功能的示例代码
Jan 19 #Python
You might like
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
web.py获取上传文件名的正确方法
2014/08/26 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Python使用贪婪算法解决问题
2019/10/22 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
渡河少年教学反思
2014/02/12 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
2014年生产部工作总结
2014/12/17 职场文书
PHP解决高并发问题
2021/04/01 PHP
html5实现点击弹出图片功能
2021/07/16 HTML / CSS