2013-02-15 40 views
6

क्या सेलेरी 3.0 से चेन का उपयोग करके बनाए गए वर्कफ़्लो को रोकने/फिर से शुरू करने का कोई तरीका है?Django Celery वर्कफ़्लो चेन रोकें/फिर से शुरू करें

असल में, हमारे सिस्टम में हमारे दो अलग-अलग प्रकार के कार्य हैं: इंटरैक्टिव और गैर-इंटरैक्टिव वाले। गैर-इंटरैक्टिव वाले हमारे पास सभी पैरामीटर हैं, लेकिन इंटरैक्टिव लोगों को उपयोगकर्ता इनपुट की आवश्यकता है। ध्यान दें कि इंटरैक्टिव कार्यों के लिए, हम केवल उपयोगकर्ता इनपुट के लिए पूछ सकते हैं जब श्रृंखला में पिछले सभी कार्यों को पूरा कर लिया गया है, क्योंकि उनके परिणाम इंटरैक्टिव कार्यों को प्रभावित करेंगे (यानी हम वास्तविक श्रृंखला बनाने से पहले उपयोगकर्ता इनपुट के लिए नहीं पूछ सकते हैं)।

इस पर कैसे पहुंचे इस पर कोई सुझाव? वास्तव में एक नुकसान यहाँ ..

वर्तमान विचारों पर:

  • (अजवाइन आयात टास्क से) कार्य के दो उपवर्गों बनाएँ। इंटरैक्टिव कार्य उपclass में एक अतिरिक्त उदाहरण (वर्ग सदस्य) चर जोड़ें जो डिफ़ॉल्ट रूप से गलत पर सेट है और यह दर्शाता है कि कुछ उपयोगकर्ता इनपुट की अभी भी आवश्यकता है। किसी भी तरह से कार्य के उदाहरण तक पहुंच है, और इसे सेलेरी कार्यकर्ता के बाहर से सच में सेट किया गया है (हालांकि मैंने इसे थोड़ा सा देखा है और यह किसी अन्य मॉड्यूल से सीधे कार्य ऑब्जेक्ट तक पहुंच नहीं लग रहा है)
  • इंटरैक्टिव नौकरियों द्वारा सीमांकित कई श्रृंखलाओं में श्रृंखला को विभाजित करें। एक बार चेरी के अंत तक पहुंचने के बाद सेलेरी कार्यकर्ता के बाहर किसी प्रकार की तंत्र का पता लगाएं और इंटरैक्टिव कार्य के इंटरैक्टिव क्लाइंट साइड घटक को ट्रिगर करें। एक बार उपयोगकर्ता ने इस डेटा को दर्ज कर लिया है, डेटा प्राप्त करें, और नई श्रृंखला शुरू करें जहां इंटरैक्टिव कार्य नई श्रृंखला के सिर पर है।

उत्तर

2

हमने आपके प्रोजेक्ट & में आपके दूसरे विचार की तरह कुछ लागू किया है, यह ठीक काम करता है। कार्यान्वयन का सारांश यहां दिया गया है।

अपने मॉडल & पर नए क्षेत्र status जोड़ें विधि को ओवरराइड करें।

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

पास status टेम्पलेट के लिए चर जो उपयोगकर्ता के लिए सूचना दर्ज करने के लिए यूआई तत्व प्रदर्शित करने के लिए उपयोगी है। जब उपयोगकर्ता आवश्यक जानकारी दर्ज करते हैं, तो स्थिति बदलें। यह custom_func पर कॉल करता है जो आपके interactive_task को ट्रिगर करता है।

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

  • कोई संबंधित समस्या नहीं^_^