使用Celery初级教程踩坑版
前言
最近看到不少公司都在招聘某岗位上要求会分布式技能,那么就不得不提一嘴Celery任务队列了。具体的概念这里不过多赘述。这篇文章有较为详细的解释【Python】Celery基本使用
一、Redis安装
- 下载地址:
https://github.com/tporadowski/redis/releases
- 解压后,双击redis-server.exe启动服务端
- 双击redis-cli.exe启动客户端连接服务端
- 在客户端输入 “ping”,出现“PONG”,即证明连接成功
二、Redis基本语法
三、Celery安装
cmd安装
pip install celery
四、Celery启动
前提是redis-server.exe一定要保持开启状态!!
- 创建celery_task.py文件作为任务执行文件
import celery
import time
backend = 'redis://127.0.0.1:6379/1' # 设置redis的1数据库来存放结果
broker = 'redis://127.0.0.1:6379/2' # 设置redis的2数据库存放消息中间件
tasks = celery.Celery('mytask', backend=backend, broker=broker) #第一个参数mytask是自定义的名字
@tasks.task
def send_email(name):
print(f"向{
name}发送邮件...")
time.sleep(20)
print(f"向{
name}发送邮件完成")
return "ok"
- 启动Celery
- 这一步会有错误,查了一下说是kombu版本问题不兼容,执行下面这个之前可以先卸载安装的kombu,我本机的是5.2.4,降到5.1.0就可以使用了,具体错误和解决方案可以看windows下celery配置连接redis报错问题修复(TypeError: init() got an unexpected keyword argement )
pip uninstall komubu
pip install komubu==5.1.0
安装完成后在该celery_task.py的当前目录下打开cmd执行下面命令启动Celery
celery -A celery_task worker -l info -P eventlet
这是一个使用Celery框架运行任务队列的命令行代码,下面是每个参数的解释:
celery: 这是运行Celery命令行工具的命令。
- A celery_task: 这个参数指定了Celery应用的模块或包的名称。在这个例子中,celery_task是指定的应用模块的名称。
- worker: 这个参数告诉Celery运行一个工作节点(worker)来处理任务队列中的任务。
- l info: 这个参数设置了日志级别,这里是将日志级别设置为"info",这意味着只会记录信息级别及以上的日志消息。
- P eventlet: 这个参数指定了Celery使用的并发处理器(concurrency backend)。
- 在这个例子中,使用的是Eventlet并发处理器,它是一个基于协程的并发库,可以实现轻量级的并发和非阻塞式I/O操作。
启动成功后的页面:
五、启动任务
新建一个main.py文件
from celery_task import send_email
result1 = send_email.delay("张三")
print(result1.id)
result2 = send_email.delay("李四")
print(result2.id)
result3 = send_email.delay("王五")
print(result3.id)
result4 = send_email.delay("赵六")
print(result4.id)
启动后会打印出任务ID:
cmd会显示运行状态:
可以用VScode的redis插件来可视化查看运行的结果:
六、检查任务结果
创建检查任务结果文件result.py
- 第一种方式直接查看任务返回结果
from celery.result import AsyncResult
from celery_task import tasks
# 1cbf50c9-e987-4db2-aaf9-1db613dcbd29
# 4b59bd86-1cdb-47c5-af81-42b61674d4fc
# c2cc3a9b-a403-4a56-9c5f-d754a216b6a7
# b37423c9-a2e8-430d-b9e8-48ed4e422294
async_result = AsyncResult(id="1cbf50c9-e987-4db2-aaf9-1db613dcbd29", app=tasks)
if async_result.successful():
result = async_result.get()
print(result)
# result.forget() # 将结果删除
elif async_result.failed():
print('执行失败')
elif async_result.status == 'PENDING':
print('任务等待中被执行')
elif async_result.status == 'RETRY':
print('任务异常后正在重试')
elif async_result.status == 'STARTED':
print('任务已经开始被执行')
运行结果:
- 从reids直接查看数据
import redis
import json
redis_data = redis.Redis(host="127.0.0.1", port=6379, db=1) # 在redis的4号数据库取数据
keys = redis_data.keys()
for key in keys:
print(key)
res = redis_data.get(key)
print(res)
res = json.loads(res.decode("utf8"))
print(res)
result = res["result"]
print(result)
运行结果:
- 用Flower查看
flower 是一款基于web的celery实时监控和管理工具。
我们可以使用celery event进行实时监控:
任务进度和历史记录
显示任务细节(参数、启动时间、运行时间等)
图表和统计数据
远程控制
查看工人状态和统计信息
关闭并重新启动工作实例
控制工作池大小和自动伸缩设置
查看和修改工作实例使用的队列
查看当前运行的任务
查看计划任务(ETA/倒计时)
查看保留和撤销的任务
应用时间和速率限制
查看配置
撤销或终止任务
HTTP API
使用
下载
pip install flower
运行flower命令将启动一个web服务器。
celery -A celery_task flower
默认端口是http://localhost:5555,可以使用-port参数来指定其他端口。
celery -A celery_task flower --port=8000
运行一下main,分配一下任务,访问http://localhost:8000:
借鉴
【Python】Celery基本使用
Redis基本语法
关于 Celery 的爬虫用法(京东爬虫)
celery之监控管理