介紹
Celery在使用時(shí)必須創(chuàng)造一個(gè)實(shí)例囊扳,也就是application吩翻,它是線程安全的兜看,所以多個(gè)Celery application(不同的配置、部件和任務(wù))都可以在一個(gè)進(jìn)程空間中存在狭瞎。
from celery import Celery
app = Celery()
app.main
<Celery __main__:0x100469fd0> # main module的名稱 __main__
名稱
當(dāng)發(fā)送任務(wù)信息時(shí)细移,是不包含任何源代碼的,只有一個(gè)任務(wù)名稱熊锭,而每個(gè)工作進(jìn)程都維持著一個(gè)任務(wù)名稱到具體函數(shù)的映射(任務(wù)注冊(cè))弧轧。每個(gè)任務(wù)在創(chuàng)建時(shí),是加在本地的碗殷,如果是在main函數(shù)中創(chuàng)建的精绎,任務(wù)名稱會(huì)以main起始∫诒猓可以使用顯示的方式指定任務(wù)名稱前綴:
>>> @app.task
... def add(x, y):
... return x + y
>>> add
<@task: __main__.add>
>>> add.name
__main__.add
>>> app.tasks['__main__.add']
<@task: __main__.add>
以上的基本沒(méi)什么用
app = Celery('tasks')
app.main
tasks
這樣之后創(chuàng)建的task就會(huì)以tasks為前綴捺典,tasks.add鸟廓。
配置
配置以這樣的順序生效:
1从祝、運(yùn)行時(shí)的修改
2、配置模塊
3引谜、默認(rèn)的配置
使用模塊名稱
app = Celery()
app.config_from_object('celeryconfig')
使用模塊
import celeryconfig
app.config_from_object(celeryconfig)
使用配置類
class Config:
enable_utc = True
timezone = 'Europe/London'
app.config_from_object(Config)
使用環(huán)境變量
os.environ.setdefault('CELERY_CONFIG_MODULE', 'celeryconfig')
app.config_from_envvar('CELERY_CONFIG_MODULE')
使用humanize打印配置信息
app.conf.humanize(with_defaults=False, censored=True)
# 不打印默認(rèn)的設(shè)置和敏感信息(如密碼)
app.conf.table(with_defaults=False, censored=True)
# 返回一個(gè)包含配置文件的dict
敏感信息指包含這些字符串的:
API, TOKEN, KEY, SECRET, PASS, SIGNATURE, DATABASE
Laziness
app
app只有在需要的時(shí)候才實(shí)例化出來(lái)牍陌,創(chuàng)建一個(gè)celery實(shí)例只是:
創(chuàng)建一個(gè)邏輯時(shí)鐘實(shí)例,用于events.
創(chuàng)建任務(wù)注冊(cè)
設(shè)置自己為當(dāng)前app(but not if the set_as_current argument was disabled)
調(diào)用app.on_init() (does nothing by default).
task
在task定義的地方并沒(méi)有構(gòu)造task员咽,在使用的時(shí)候才創(chuàng)建毒涧,或者被finalized:
@app.task
def add(x, y):
return x + y
add.__evaluated__()
False
add # 調(diào)用add的repr
<@task: __main__.add>
add.__evaluated__()
True
finalize
Finalization 顯式調(diào)用 app.finalize() 或 獲取app.tasks的屬性
復(fù)制需要在應(yīng)用之間共享的任務(wù)
默認(rèn)為共享的,如果設(shè)為不共享則任務(wù)是綁定它的app所私有的贝室。
運(yùn)行所有的task裝飾器
確保所有的task綁定到當(dāng)前app
這樣task可以讀取配置
抽象Tasks
@app.task(base=OtherTask):
def add(x, y):
return x + y
from celery import Task
class DebugTask(Task):
def __call__(self, *args, **kwargs):
print('TASK STARTING: {0.name}[{0.request.id}]'.format(self))
return super(DebugTask, self).__call__(*args, **kwargs)