1 celery介绍
# celery:翻译过来叫芹菜,它是一个 分布式的异步任务 框架 # celery有什么用? 1 完成异步任务:可以提高项目的并发量,之前开启线程做,现在使用celery做 2 完成延迟任务 3 完成定时任务 # 架构 -消息中间件:broker 提交的任务(函数)都放在这里,celery本身不提供消息中间件,需要借助于第三方:redis,rabbitmq -任务执行单元:worker,真正执行任务的地方,一个个进程,执行函数 -结果存储:backend,函数return的结果存储在这里,celery本身不提供结果存储,借助于第三方:redis,数据库,rabbitmq
2 celery快速使用
# 1 celery官网:http://www.celeryproject.org/ # 2 介绍:Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform # 3 celery是独立的服务 """ 1)可以不依赖任何服务器,通过自身命令,启动服务 2)celery服务为为其他项目服务提供异步解决任务需求的 注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求 人是一个独立运行的服务(django) | 医院也是一个独立运行的服务(celery) 正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题 人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求 """
# 1 安装:pip3 install celery # 2 使用步骤 -写一个main.py :实例化得到app对象,写函数,任务,注册成celery的任务
-再别的程序中:提交任务--->提交到broker中去了 add.delay(3,4) -启动worker,从broker中取任务执行,执行完放到backend中 win: celery worker -A main -l info -P eventlet # 4.x及之前用这个 celery -A main worker -l info -P eventlet # 5.x及之后用这个 lin,mac: celery worker -A main -l info celery -A main worker -l info -再backend中查看任务执行的结果 -直接看 -通过代码查看 from main import app from celery.result import AsyncResult id = '7bef14a0-f83e-4901-b4d8-e47aaac09b39' if __name__ == '__main__': res = AsyncResult(id=id, app=app) if res.successful(): result = res.get() #7 print(result) elif res.failed(): print('任务失败') elif res.status == 'PENDING': print('任务等待中被执行') elif res.status == 'RETRY': print('任务异常后正在重试') elif res.status == 'STARTED': print('任务已经开始被执行')
main.py from celery import Celery import time backend = 'redis://127.0.0.1:6379/1' broker = 'redis://127.0.0.1:6379/0' app = Celery('test', backend=backend, broker=broker) # 写任务,任务就是函数,加个装饰器,变成celery的任务 @app.task def add(a, b): time.sleep(2) # 假设任务耗时比较久 print(a + b) return a + b
3 celery包结构