Celery 组件等指南

主名称(Main Name)

from celery import Celery

# Celery(name)
# 这里的name是设置主模块的名称。
# 默认会使用主模块的名称作为任务名称的开头

配置 Configuration

设置的方法

  • 直接设置 app.conf.timezone = 'Asia/Shanghai' app.conf.enable_utc=True
  • 通过update进行一次性设置
my_celery = Celery('tasks')
my_celery.conf.update(
  enablt_utc=True,
  timezone='Asia/Shanghai',
)

config_from_object

config_from_object() :可以从配置对象中进行加载配置

加载的内容可以为配置模块,也可以为用于属性的对象

config_from_object() 在进行调用时会恢复默认的配置,需要设置其他的配置,建议在调用完毕之后进行操作

使用模块名称

from celery import Celery
app = Celery()
app.config_from_object('celeryconfig')

celeryconfig模块内容

# celeryconfig.py
enable_utc = True
timezone = 'Asia/Shanghai'

导入celeryconfig程序就可

使用模块对象

import celeryconfig
from celery import Celery
app = Celery()
app.config_from_object(celeryconfig)

使用配置类/对象

from celery import Celery

app = Celery()

class Config:
    enable_utc = True
    timezone = 'Europe/London'

app.config_from_object(Config)

config_from_envvar

config_from_envver():从系统环境变量获取信息进行配置

例子

CELERY_CONFIG_MODULE='celeryconfig.prod' celery worker -l info
import os
from celery import Celery

#: Set default configuration module name   设置环境变量默认的值
os.environ.setdefault('CELERY_CONFIG_MODULE', 'celeryconfig')

app = Celery()
app.config_from_envvar('CELERY_CONFIG_MODULE')

配置更新

celery.conf.update()

调用任务 Calling Tasks

获取消息 On Message

Celery通过消息回调,获取所有状态的改变

@app.task(bind=True)
def hello(self, a, b):
    time.sleep(1)
    self.update_state(state="PROGRESS", meta={'progress': 50})
    time.sleep(1)
    self.update_state(state="PROGRESS", meta={'progress': 90})
    time.sleep(1)
    return 'hello world: %i' % (a+b)

消息回调

def on_raw_message(body):
    print(body)

r = hello.apply_async(4, 6)
print(r.get(on_message=on_raw_message, propagate=False))

# propagate: 禁止celery抛出异常

判断任务的执行状态,判断任务是否执行失败

res.state

# 一个任务当前只能有且一个状态,但他的执行过程可以为多个状态,一个典型的阶段时:
PENDING  --> STARTED --> SUCCESS

获取任务的返回值

res = add.delay(2,2)
res.get(timeout=1)

通过id属性进行获取任务的ID

res.id

启动状态是一种比较特殊的状态,仅在 task_track_started 启用设置或 @task(track_started=True)的情况下才会进行记录。 挂起状态实际上不是记录状态,而是未知任务ID的默认状态

ETA and Countdown

  • ETA:预计到底时间,设置一个日期和时间,在这个时间之前任务将被执行,必须是一个datetine对象,并且指定确切的日期和时间
  • countdown:是一种以秒为单位设置ETA的快捷方式,是整数
result = add.apply_async((2,2), countdown=3)

from datetime import datetime, timedelta

tomorrow = datetime.utcnow() + timedelta(days=1)
add.apply_async((2,2), etc=tomorrow)

路由选择

使用queue可以完成简单的路由

add.apply_async(queue="priority.high")

然后指派workers给priority.high的队列,使用worker -Q 参数分配队列

celery -A proj worker -l info -Q celery,priority.high

不建议用代码队列名称进行硬编码,最好使用配置路由器(task_routes)

posted @ 2022-05-20 00:50  Lin-Grocery  阅读(120)  评论(0编辑  收藏  举报