Python中任务队列-芹菜celery的使用
一、关于celery
芹菜celery是一个python实现的异步任务队列,可以用于爬虫、web后台查询、计算等等。通过任务队列,当一个任务来临时不再傻傻等待。
他的架构如下:
- Broker
我们的生产者创建任务后会进入celery的任务调度队列中间件Broker,Broker通过调度规则将消息(任务)调度消息队列,Broker依赖第三方队列消息代理如rabbitmq
、redis
等。
- Worker
广大劳动者,盯着消息队列,当队列中有消息时把它拿过来给处理了。
- Backend
用于结果存储经worker处理的结果,比如常用的数据库等。
使用celery
在本文中咱们使用rabbitmq
(celery推荐)作为消息代理中间件。
我们创建的celery目录如下
learn_celery/
...celery_env/
...celery.py
...my_task1.py
...my_task2.py
...task1_run.py
...task2_run.py
1. 创建虚拟环境并安装celery、flower(web监控),这里不做赘述。
2.安装咱们的消息队列中间件rabbitmq
这里以docker的方式运行并配置,指定主机名为rabbit
(rabbitmq是以主机名来访问的,所以这是必须的),容器名称为celery_rabbitmq
docker run -d -p 5672:5672 -h rabbit --name celery_rabbitmq rabbitmq
添加用于celery访问的用户,以及配置configure
、write
和read
权限,在下面我们配置rabbit_user拥有所有配置、写入和读取权限。
docker exec -it celery_rabbitmq rabbitmqctl add_user rabbit_user rabbit_pass
docker exec -it celery_rabbitmq rabbitmqctl add_vhost rabbit_vhost
docker exec -it celery_rabbitmq rabbitmqctl set_user_tags rabbit_user celery
docker exec -it celery_rabbitmq rabbitmqctl set_permissions -p rabbit_vhost rabbit_user ".*" ".*" ".*"
3.创建celery应用
#celery.py
from celery import Celery
broker_rabbitmq="amqp://rabbit_user:rabbit_pass@i-k9pwet2d/rabbit_vhost"
app=Celery("learn_celery",broker=broker_rabbitmq,backend="rpc://",include=["learn_celery.my_task2","learn_celery.my_task2"])
我们通过创建app来实例化Celery,项目包的名称为learn_celery
,通过broker_rabbitmq
来连接rabbitmq,rabbitmq的amqp协议格式为
amqp://userid:password@hostname:port/virtual_host
由于我们是在docker中启动的rabbitmq,所以我们的hostname应该为宿主机的hostname。
指定后端通过rpc回传数据,include加载带worker处理的任务learn_celery.my_task1
、learn_celery.my_task2
4.创建两个任务(消息)
#my_task1.py
from .celery import app
import time
@app.task
def args_add1(x,y):
print("start task no.1 now!")
time.sleep(10)
print("task no.1 end!")
return x+y
#my_task12.py
from .celery import app
import time
@app.task
def args_add2(x,y):
print("start task no.2 now!")
time.sleep(20)
print("task no.2 end!")
return x+y
在这里我们导入了celery中的app,并用它来装饰我们的方法args_add
,在args_add中模拟任务处理时间分别为10s、20s然后返回结果。
5.发送任务给celery
#tasks1_run.py
from .my_task1 import args_add1
import time
reslut=args_add1.delay(11,22)
print("task over?{}".format(reslut.ready()))
print("task reslut:{}".format(reslut.result))
time.sleep(15)
print("task over?{}".format(reslut.ready()))
print("task reslut:{}".format(reslut.result))
#tasks2_run.py
from .my_task2 import args_add2
import time
reslut=args_add2.delay(33,44)
print("task over?{}".format(reslut.ready()))
print("task reslut:{}".format(reslut.result))
time.sleep(25)
print("task over?{}".format(reslut.ready()))
print("task reslut:{}".format(reslut.result))
关于任务的delay
,官方文档(参考)是这样描述的,我把它理解为发送任务给celery或者celery调用待进来的任务。
reslut.ready()
返回任务执行是否执行完成True
or False
reslut.result
返回任务执行结果
我们在任务进入celery和结束分别检查一次。
二、看看结果
1.启动worker
进入learn_celery的父目录。启动learn_celery的这个应用worker,并指定并发数为10个
celery -A learn_celery worker --loglevel=info --concurrency=10
若celery连接rabbitmq正常,我们可以看到如下的info
2.执行任务
为了便于观察,我们另外开启一个窗口2,到learn_celery父目录运行task1_run模块
python -m learn_celery.tasks1_run
开启窗口3,到learn_celery父目录运行task2_run模块
python -m learn_celery.tasks2_run
可以看到经过各自任务的等待时间后,两个任务都顺利执行结束,并得到结果,接下来我们到worker上看一下info
由于celery的并发性,收到任务马上被调入执行,任务1耗时10s结果为33,任务2耗时20s结果为77
三、使用Flower监控celery
1.启动flower
celery -A learn_celery flower
2. 查看web监控 http://ip:5555
在Tasks
中可以查看到当前任务队列的状态、参数、接收和启动、执行时间。
在Dashborad
中查看当前worker节点的相关信息
文章有不足的地方欢迎指出。
欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。
NEXT
celery的深入了解
celery在django中的使用
Python中任务队列-芹菜celery的使用的更多相关文章
- Python中Celery 的基本用法以及Django 结合 Celery 的使用和实时监控进程
celery是什么 1 celery是一个简单,灵活且可靠的,处理大量消息的分布式系统 2 专注于实时处理的异步任务队列 3 同时也支持任务调度 执行流程 Celery 基本使用 tasks.py i ...
- python中利用redis构建任务队列(queue)
Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...
- Python 并行分布式框架 Celery
Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...
- 【转】Python 并行分布式框架 Celery
原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...
- python中的轻量级定时任务调度库:schedule
提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中.不过,一个小的定时脚本,要用celery的话太“重”了.所以,我找到了一个轻量级的定时任务调度的库:sch ...
- 11: python中的轻量级定时任务调度库:schedule
1.1 schedule 基本使用 1.schedule 介绍 1. 提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中. 2. 不过,一个小的定时脚本,要用 ...
- Python定时任务-schedule vs. Celery vs. APScheduler
在Python开发过程中我们经常需要执行定时任务,而此类任务我们通常有如下选项: 自己造轮子 使用schedule库 使用Celery定时任务 使用APScheduler 自己造轮子实现,最大的优势就 ...
- 任务队列 与 Celery概述
一.任务队列(Task Queues) 1.1 什么是任务队列? 任务队列用于管理后台工作,通常这些后台工作必须在 HTTP请求-响应循环 之外执行. 1.2 为什么需要任务队列? 对于那些不是由客户 ...
- Python中实现异步并发查询数据库
这周又填了一个以前挖下的坑. 这个博客系统使用Psycopy库实现与PostgreSQL数据库的通信.前期,只是泛泛地了解了一下SQL语言,然后就胡乱拼凑出这么一个简易博客系统. 10月份找到工作以后 ...
随机推荐
- Ansible_常用文件模块使用详解
一.Ansibel常用文件模块使用详解 1.file模块 1️⃣:file模块常用的参数列表: path 被管理文件的路径 state状态常用参数: absent 删除 ...
- 030. Python装饰器
一 装饰器 1.1 装饰器介绍 扩展函数新功能的@定义:替换旧函数,返回新函数,在不改变原有代码的前提下,为该函数扩展新功能;语法:@ (语法糖) 1.2 装饰器的原型 def show(func) ...
- TEB 系统综合误差
TEB 系统综合误差 和森世籍 聊天得知 该TEB 包括 传感器误差 温度 系统误差等等
- docker 部署应用
Docker 部署应用 所需环境 Linux系统:centos7 (推荐7.4) Docker环境:V1.13.1 镜像:应用镜像包 docker部署和基本命令: 1. docker环境搭建 a) ...
- CSS的引入方式和复合选择器
CSS的引入方式 样式表 优点 缺点 范围 行内样式表 书写方便 结构样式混写 控制一个标签 内部样式表 部分结构和样式相分离 没有彻底 控制一个页面 外部样式表 完全实现结构和样式分离 需要引入 控 ...
- vue 安装sass5.0版本遇到的问题
cnpm install node-sass@4.9.2 --save-dev cnpm install sass-loader@7.3.1 --save-dev cnpm install style ...
- Ajax|看这一篇就够了!详解Ajax工作原理及开发步骤
传统开发的缺点,是对于浏览器的页面,全部都是全局刷新的体验.如果我们只是想取得或是更新页面中的部分信息那么就必须要应用到局部刷新的技术. 局部刷新也是有效提升用户体验的一种非常重要的方式. Ajax技 ...
- grasshopper之python电池执行逻辑
在grasshopper中,需要导入的包虽然不多,但是相当绕人,所要实现的操作往往找不到,暂时做个分类. 双击输入 python 电池: # 导入rhino 包 import Rhino #Rhino ...
- 基于Jittor框架实现LSGAN图像生成对抗网络
基于Jittor框架实现LSGAN图像生成对抗网络 生成对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的 ...
- 硬件安全模块如何启用AUTOSAR
硬件安全模块如何启用AUTOSAR How hardware security modules enable AUTOSAR 越来越复杂的软件和车内连接需要越来越多的加密保护.这种保护也必须由经典的实 ...