您可以編寫自定義加載程序或使用信號。
裝載機具有on_task_init
方法,在任務即將執行時調用, 和on_worker_init
由celery + celerybeat主進程調用。
使用的信號可能是最簡單的,可用的信號是:
0.8.4:
task_prerun(task_id, task, args, kwargs)
當任務即將由工人來執行調度(或本地 如果使用apply
/或者如果CELERY_ALWAYS_EAGER
已設置)。
task_postrun(task_id, task, args, kwargs, retval)
在與上面相同的條件下執行任務後分派。
task_sent(task_id, task, args, kwargs, eta, taskset)
在0.9.x版本(在github當前主分支)當施加一個任務被調用(不適合長時間運行的操作)可用
附加信號:
下面是一個例子預先計算的東西第一次任務的過程中運行:
from celery.task import Task
from celery.registry import tasks
from celery.signals import task_prerun
_precalc_table = {}
class PowersOfTwo(Task):
def run(self, x):
if x in _precalc_table:
return _precalc_table[x]
else:
return x ** 2
tasks.register(PowersOfTwo)
def _precalc_numbers(**kwargs):
if not _precalc_table: # it's empty, so haven't been generated yet
for i in range(1024):
_precalc_table[i] = i ** 2
# need to use registered instance for sender argument.
task_prerun.connect(_precalc_numbers, sender=tasks[PowerOfTwo.name])
如果你想對所有任務運行功能,只跳過sender
說法。
你需要運行什麼樣的自定義初始化? – diegueus9 2010-01-25 03:37:41
我需要加載處理每個任務所需的〜10MB數據結構(所有任務的結構都是相同的)。 – xelk 2010-01-25 04:12:38