आप या तो एक कस्टम लोडर लिखते हैं, या संकेतों का उपयोग कर सकते हैं।
लोडर on_task_init
विधि है, जो जब किसी कार्य के बारे में, निष्पादित किया जाना है कहा जाता है और on_worker_init
जो अजवाइन + celerybeat मुख्य प्रक्रिया द्वारा कहा जाता है।
सबसे आसान का उपयोग करते हुए संकेत शायद है, संकेत उपलब्ध हैं:
0.8.x:
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 पर वर्तमान मास्टर शाखा):
worker_init()
कोलेरीड शुरू होने पर कॉल किया गया (कार्य शुरू होने से पहले,पर fork
का समर्थन करने वाली प्रणाली, किसी भी स्मृति परिवर्तन को बच्चे कार्यकर्ता प्रक्रियाओं में कॉपी किया जाएगा)।
worker_ready()
कहा जाता है जब celeryd कार्य प्राप्त करने में सक्षम है।
worker_shutdown()
कहा जाता है जब celeryd बंद हो रहा है।
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
तर्क को छोड़:
यहाँ एक उदाहरण कुछ पहली बार किसी कार्य प्रक्रिया में चलाया जाता है precalculating है।
आपको किस प्रकार की कस्टम प्रारंभिकरण की आवश्यकता है? – diegueus9
मुझे प्रत्येक कार्य को संसाधित करने के लिए आवश्यक ~ 10 एमबी डेटा संरचना लोड करने की आवश्यकता है (संरचना सभी कार्यों के लिए समान है)। – xelk