简介:Celery是一个Python开源的分布式任务队列,可以用于异步处理、任务调度等场景。在Python应用开发中被广泛使用。Celery通过提供丰富的API和灵活的配置选项,可以很方便地与其他框架和库整合,如Django、Flask等。Celery可以让开发者专注业务逻辑的实现,而不必过多关心任务的执行和调度细节。利用这个可以带来应用解耦、异步提速、削峰填谷 三大功效。
工作原理:Celery 通过消息机制进行通信,通常使用中间人(Broker)作为客户端和职程(Worker)调节。启动一个任务,客户端向消息队列发送一条消息,然后中间人(Broker)将消息传递给一个职程(Worker),最后由职程(Worker)进行执行中间人(Broker)分配的任务。Celery 可以有多个职程(Worker)和中间人(Broker),用来提高Celery的高可用性以及横向扩展能力。Flower是基于web的监控和管理Celery的工具,和任务队列是隔离的,flower的运行并不会影响到任务队列的真正执行。flower作为celery后台任务的管理工具,将各个任务的执行情况、各个worker的健康状态进行实时监控并以可视化的方式展现。
历史攻略:
win10:安装docker和测试安装redis
centos7:docker安装Redis并用Redis Desktop Manager连接
消息队列对比:Redis、Kafka 和 Pulsar
Python高阶:counter、orderedDict、defaultdict、deque、queue简单示例
项目目录结构:
.
├── main.py
├── tasks.py
└── requirements.txt
main.py:
# -*- coding: utf-8 -*-
# time: 2023/4/6 21:52
# file: main.py
# 公众号: 玩转测试开发
from tasks import add, subtract, multiply, divide
result = list()
loop = 5
for i in range(loop):
result.append(add.delay(8, 2).get())
result.append(subtract.delay(8, 2).get())
result.append(multiply.delay(8, 2).get())
result.append(divide.delay(8, 2).get())
print(f"result:{result}")
tasks.py:
# -*- coding: utf-8 -*-
# time: 2023/4/6 21:45
# file: tasks.py
# 公众号: 玩转测试开发
from celery import Celery
# 连接远程 redis服务的地址和端口号
redis_host = '远程服务器ip'
redis_port = '6379'
app = Celery('tasks', broker=f'redis://{redis_host}:{redis_port}/0', backend=f'redis://{redis_host}:{redis_port}/1')
@app.task
def add(x, y):
return x + y
@app.task
def subtract(x, y):
return x - y
@app.task
def multiply(x, y):
return x * y
@app.task
def divide(x, y):
return x / y
requirements.txt:
eventlet
celery===5.2.7
flower
redis
安装:
pip install -r requirements.txt
创建和运行redis:
docker run -itd --name redis-test -p 6379:6379 redis
win下操作步骤:
进入项目目录,运行
celery -A tasks worker --loglevel=info -P eventlet
启动celery监控和管理Flower:
celery -A tasks flower --address=127.0.0.1 --port=5555
执行测试:
python main.py
运行结果:
Flower的监控状况:
注意事项:
在win10下启动celery时,最好带上参数 -P eventlet 否则可能数据会无法正常解析