2023Python3.8使用Celery初级教程踩坑版(从Redis的安装到Celery结果查询)

前言

最近看到不少公司都在招聘某岗位上要求会分布式技能,那么就不得不提一嘴Celery任务队列了。具体的概念这里不过多赘述。这篇文章有较为详细的解释【Python】Celery基本使用

一、Redis安装

  1. 下载地址:
https://github.com/tporadowski/redis/releases
  1. 解压后,双击redis-server.exe启动服务端
    在这里插入图片描述
  2. 双击redis-cli.exe启动客户端连接服务端
  3. 在客户端输入 “ping”,出现“PONG”,即证明连接成功在这里插入图片描述

二、Redis基本语法

Redis基本语法

三、Celery安装

cmd安装

pip install celery

四、Celery启动

前提是redis-server.exe一定要保持开启状态!!

  1. 创建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"
  1. 启动Celery
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

  1. 第一种方式直接查看任务返回结果
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('任务已经开始被执行')

运行结果:
在这里插入图片描述

  1. 从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)

运行结果:
在这里插入图片描述

  1. 用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之监控管理

猜你喜欢

转载自blog.csdn.net/qq_41866988/article/details/130553671