celery分布式使用
Celery的架构
Celery包含如下组件:
1. Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列(一般用于定时任务使用)。
2. Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
3. Broker:消息代理,或者叫作消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(本方案使用redis)。
4. Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
5. Result Backend:任务处理完后保存状态信息和结果,以供查询。(本方案使用redis来存储结果)
Celery的架构图如图所示。

需要用到
from kombu import Queue
from flask import Flask
from celery import Celery
from celery.result import AsyncResult
部分代码如下:
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_QUEUES = ( # 定义任务队列
Queue("tasks_A", routing_key="A.#"), # 路由键以“A.”开头的消息都进tasks_A队列
)
CELERY_ROUTES = (
[
("distributed.taskA", {"queue": "tasks_A"}), # 将taskA任务分配至队列 tasks_A
],
)
CELERY_RESULT_SERIALIZER = "json" # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间
app = Flask(__name__)
CELERY_RESULT_BACKEND = 'redis://:poseidon123456@127.0.0.1:6379/0'
BROKER_URL = 'redis://:poseidon123456@127.0.0.1:6379/1'
app.config['CELERY_BROKER_URL'] = BROKER_URL
app.config['CELERY_RESULT_BACKEND'] = CELERY_RESULT_BACKEND
app.config['CELERY_QUEUES'] = CELERY_QUEUES
app.config['CELERY_TIMEZONE'] = CELERY_TIMEZONE
app.config['CELERY_ROUTES'] = CELERY_ROUTES
app.config['CELERY_RESULT_SERIALIZER'] = CELERY_RESULT_SERIALIZER
app.config['CELERY_TASK_RESULT_EXPIRES'] = CELERY_TASK_RESULT_EXPIRES
app.config['CELERY_TASK_REJECT_ON_WORKER_LOST'] = True
app.config['CELERYD_PREFETCH_MULTIPLIER'] = 1
开启work的方式
celery -A distributed.celery worker -Q tasks_A --concurrency=2 -l info
-Q后面为方法对应的队列名称
--concurrency= 后面 为开启的worker数目,也可以使用 -c=
具体开启是数目根据你的电脑CPU个数确定,小于等于cpu个数即可
备注
- celery 使用4.1.1版本
- kombu 使用4.2.0版本
*先安装kombu,然后安装celery- 可以解决如图问题
python(3.8.2)之后celery4.1.1版本使用不了,目前使用5.0.2版本,然后又遇见以下错误:
启动celery时,报 from . import async, base SyntaxError: invalid syntax
查了资料后了解到是因为celery依赖中的async模块和Python的关键字async存在冲突, 所以在导入时报错。
使用 pip install --upgrade https://github.com/celery/celery/tarball/master 来更新一下就行了。


浙公网安备 33010602011771号