0 常规操作
1.查看等待队列长度: celery -A tasks inspect reserved | wc -l
2.查看运行的worker数: celery -A tasks inspect active | wc -l
3.REVOKED--超时未开始执行被移除,不占用worker,expires来确定
ready()--是在任务成功或失败或超时未执行被移除之后都会进入的状态
1 安装及基础
1.定义
Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统
它是一个专注于实时处理的任务队列,同时也支持任务调度
中文官网:http://docs.jinkan.org/docs/celery/
2.在线安装 sudo pip3 install -U Celery
离线安装
tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python3 setup.py build
python3 setup.py install
3.名词解释:
broker - 消息传输的中间件,生产者一旦有消息发送,将发至broker;【RQ,redis】
backend - 用于存储消息/任务结果,如果需要跟踪和查询任务状态,则需添加要配置相关
worker - 工作者 - 消费/执行broker中消息/任务的进程
4.app的返回值:包含应用类的名称(Celery),当前主模块的名称(main),以及应用对象的内存地址(0x100469fd0),
当Celery不能探查到这个任务函数属于哪个模块时,它将使用主模块名称来产生任务名称的前缀。
5.任务注册表:消息队列中保存的是任务的名称,他是由一个映射--任务注册表,将实际任务与名称映射的。每定义一个任务就会添加到该表。
这在有些情况下会产生问题:
1. 定义任务的主模块作为一个程序运行。此时模块名称会变。
2. 应用在python交互终端创建。
2 Celery单任务、多任务、定时任务
1.基本结构:
producer + worker + result
producer:
from celery import Celery
app = Celery('celery_name', broker='redis://:password@127.0.0.1:6379/1',backend='redis://:password@127.0.0.1:6379/2',) # broker任务通道
@app.task
def task_test(a,b):
print("task is running....")
return a + b
from tasks import task_test
s = task_test.delay(a,b) # 推送任务,可在其他模块调用
s.result
worker:
celery -A tasks worker -l info
2.单任务结构:创建任务(tasks.py) + 推送任务(add.py) + 执行任务(run.py) + 获取结果(result.py)
创建任务:...
推送任务:... print(result.id) # 获取推送后立即得到的id
执行任务:from tasks import app
if __name__=='__main__':
app.worker_main()
# 等同于终端命令执行
获取结果:
from celery_app_task import app
from celery.result import AsyncResult
async = AsyncResult(id="e919d97d-2938-4d0f-9265-fd8237dc2aa3", app=app)
if async.successful():
result = async.get()
print(result)
# result.forget() # 将结果删除
elif async.failed():print('执行失败')
elif async.status == 'PENDING':print('任务等待中被执行',刚刚推送出任务时或者任务还没有给worker的状态)
elif async.status == 'RETRY':print('任务异常后正在重试')
elif async.status == 'STARTED':print('任务已经开始被执行')
elif async.status == 'SUCCESS':print('任务已经执行完毕')
elif async.status == 'FAILURE':print('任务执行失败',)
elif async.ready() == True:print('任务完结',任务执行成功完毕,或者任务执行超时,或者任务报错直接停止)
elif async