celery基础

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.

你可能感兴趣的:(celery基础)