celery
https://www.celerycn.io/ 中文文档
应用
demo:
# tasks.py
from celery import Celery
app = Celery("tasks", broker="redis://localhost:port/db")
@app.task
def add(x, y):
return x + y
启动 worker
服务
celery -A tasks worker --loglevel=info
-c 设置并发数,默认为当前计算机的CPU数
multi start 后台启动
multi restart 后台重启
multi stop 停止
multi stopwait 任务执行完后停止
调用任务
from tasks import add
add.delay(3, 4)
# apply_async() 可以指定调用时执行的参数,例如运行的时间,使用的任务队列等:
add.apply_async((2, 2), queue='lopri', countdown=10)
保存结果
app = Celery('tasks', backend='redis://localhost', broker='redis://')
检测状态
>>> result = add.delay(4, 4)
>>> result.ready()
False
回溯
>>> result.traceback
配置模块
broker_url = 'pyamqp://' # broker 任务保存
result_backend = 'rpc://' # result 结果保存
task_serializer = 'json' # 任务序列化方式
result_serializer = 'json' # 结果的序列化方式
accept_content = ['json'] # 允许的序列化方式,忽略其他方式
timezone = 'Asia/Shanghai' # 时区
enable_utc = False # 不使用UTC
# 任务执行错误时专用队列
task_routes = {
'tasks.add': 'low-priority',
}
# 执行任务限速 每分钟允许执行10个任务
task_annotations = {
'tasks.add': {'rate_limit': '10/m'}
}
检测配置模块是否正确
$ python -m celeryconfig
加载配置模块
app.config_from_object('celeryconfig')
结果获取
>>> res = add.delay(2, 2)
>>> res.get(timeout=1) # 1s后获取值
4
>>> res.id # 获取任务的ID
d6b3aea2-fb9b-4ebc-8da4-848818db9114
>>> res.get(propagate=False) # 如果任务执行引发异常 调用结果时会报错 用propagate=False禁用
TypeError('add() takes exactly 2 arguments (1 given)',)
# 查看任务执行是否失败还是成功
>>> res.failed()
True
>>> res.successful()
False
# 查看任务执行转态
>>> res.state
'FAILURE'
签名: 通过一种方式进行封装任务调用的参数以及执行选项 签名实例可以指定参数(可指定部分参数), 也可以设置新的参值,新设置的参数会覆盖原有的参数值 (debug=True)
>>> add.signature((2, 2), countdown=10)
tasks.add(2, 2)
>>> add.s(2, 2) # 快捷操作
tasks.add(2, 2)
# incomplete partial: add(?, 2)
>>> s2 = add.s(2)
# resolves the partial: add(8, 2)
>>> res = s2.delay(8)
>>> res.get()
10
>>> s3 = add.s(2, 2, debug=True)
>>> s3.delay(debug=False) # debug is now False.