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 来更新一下就行了。

posted @ 2020-11-13 01:41  makerroot  阅读(129)  评论(2)    收藏  举报