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)
本文来自博客园,作者:Lin-Grocery,转载请注明原文链接:https://www.cnblogs.com/moniter/articles/celery-zu-jian-deng-zhi-nan.html