Celery是一个简单,灵活且可靠的分布式系统,可以处理大量消息,同时为操作提供维护该系统所需的工具。
这是一个任务队列,着重于实时处理,同时还支持任务调度。
任务队列是用在线程或计算机之间分配工作的机制
Celery通过消息进行通信,通常使用代理在客户端和工作人员之间进行调解。为了启动任务,客户端将消息添加到队列中,然后代理将消息传递给工作人员
celery_test工作目录结构
(Quantification) appledeMac-mini-3:celery_test apple$ tree
.
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ ├── celery.cpython-37.pyc
│ ├── celeryconfig.cpython-37.pyc
│ └── tasks.cpython-37.pyc
├── celery.py #主程序
├── celeryconfig.py #配置文件
└── tasks.py # 任务模块
celery.py
#
# Python3开始,import 默认只做absolute import
# from __future__ import absolute_import
from celery import Celery
from celery_test import celeryconfig
# 实例化celery对象,任务调度利器(分布式任务调度模块)
app=Celery('celery_test')
# 加载app配置文件
# 1. app.config_from_object('celery_test.celeryconfig')
# 2.
app.config_from_object(celeryconfig)
if __name__ == '__main__':
app.start()
celeryconfig.py
# Celery本身不含消息服务,它使用第三方消息服务来传递任务
# 选redis作为消息服务(Broker),Celery默认使用的是RabbitMQ
# 也可以通过 -b 选项在命令行进行设置其他的中间人(Broker)
broker_url = 'redis://127.0.0.1:6379/1'
# 保存结果:如果想跟踪任务状态,Celery需要存储任务状态信息.
# Celery 内置了一些后端结果:SQLAlchemy/Django ORM、Memcached、Redis、 RPC (RabbitMQ/AMQP)以及自定义的后端结果存储中间件
backend=''
# 指定序列化方式
task_serializer = 'json'
# 指定区时间
tiemzone = 'Asia/Shanghai'
# 导入任务模块列表
include=['celery_test.tasks',]
tasks.py
# 装饰器从所有可调用对象中创建任务类
from celery_test.celery import app
@app.task
def add(x,y):
return x+y
@app.task
def mul(x,y):
return x*y
启动Celery Worker
celery -A celery_test worker -l info
调用celery中的任务
>>> from celery_test.tasks import add,mul
# delay : Returns: celery.result.AsyncResult: Future promise(异步执行)
>>> res=add.delay(2,3)
>>> res
<AsyncResult: fe2a3e01-b285-4f68-bd76-cdb5d4f3d15f>
Celery端会显示
[2020-04-10 15:57:26,200: INFO/ForkPoolWorker-2]
Task celery_test.tasks.add[fe2a3e01-b285-4f68-bd76-cdb5d4f3d15f] succeeded in 0.0014597050000002554s: 8
启动Celery Worker 的debug模式
celery -A celery_test worker -l debug
调用celery中的任务–>Celery端会显示的更详细: