2010-01-25 6 views
16

मेरे पास एक Django प्रोजेक्ट है और मैं पृष्ठभूमि प्रक्रिया के लिए कार्यों को सबमिट करने के लिए सेलेरी का उपयोग करने की कोशिश कर रहा हूं (http://ask.github.com/celery/introduction.html)। सेलेरी Django के साथ अच्छी तरह से एकीकृत करता है और मैं अपने कस्टम कार्यों को जमा करने और वापस परिणाम प्राप्त करने में सक्षम हूं।मेरे कार्यों को चलाने से पहले कस्टम प्रारंभिक फ़ंक्शन को कॉल करने के लिए मैं सेलरी कैसे सेट कर सकता हूं?

एकमात्र समस्या यह है कि मुझे डेमॉन प्रक्रिया में कस्टम प्रारंभ करने का एक सौहार्दपूर्ण तरीका नहीं मिल रहा है। मुझे एक महंगी फ़ंक्शन कॉल करने की आवश्यकता है जो कार्यों को संसाधित करने से पहले बहुत सारी मेमोरी लोड करता है, और मैं हर बार उस समारोह को कॉल करने का जोखिम नहीं उठा सकता।

क्या किसी को भी इससे पहले समस्या थी? सेलेरी स्रोत कोड को संशोधित किए बिना किसी भी विचार को इसके आसपास कैसे काम करना है?

धन्यवाद

+0

आपको किस प्रकार की कस्टम प्रारंभिकरण की आवश्यकता है? – diegueus9

+0

मुझे प्रत्येक कार्य को संसाधित करने के लिए आवश्यक ~ 10 एमबी डेटा संरचना लोड करने की आवश्यकता है (संरचना सभी कार्यों के लिए समान है)। – xelk

उत्तर

15

आप या तो एक कस्टम लोडर लिखते हैं, या संकेतों का उपयोग कर सकते हैं।

लोडर 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 है।

संबंधित मुद्दे

 संबंधित मुद्दे