2010-10-10 19 views
30

Celery documentation बताता है कि कार्यों को अन्य कार्यों के परिणामों पर इंतजार करना एक बुरा विचार है ... लेकिन सुझाया गया समाधान ("अच्छा" शीर्षक देखें) वांछित होने के लिए कुछ छोड़ देता है। विशेष रूप से, उपटस्क के परिणाम को कॉलर पर वापस लाने का कोई स्पष्ट तरीका नहीं है (यह भी, यह बदसूरत है)।पायथन + अजवाइन: नौकरी की चेनिंग?

तो, क्या "चेनिंग" नौकरियों का कोई तरीका है, इसलिए कॉलर को अंतिम नौकरी का परिणाम मिल जाता है? उदाहरण के लिए, add उदाहरण उपयोग करने के लिए:

>>> add3 = add.subtask(args=(3,)) 
>>> add.delay(1, 2, callback=add3).get() 
6 

वैकल्पिक रूप से, यह परिणाम के उदाहरण लौटने के लिए ठीक है? उदाहरण के लिए:

@task 
def add(x, y, callback=None): 
    result = x + y 
    if callback: 
     return subtask(callback).delay(result) 
    return result 

यह दिया जाएगा श्रृंखला में "अंतिम" काम का परिणाम एक साधारण के साथ retrived जा सकता है:

result = add(1, 2, callback=add3).delay() 
while isinstance(result, Result): 
    result = result.get() 
print "result:", result 
+0

क्या आप प्रस्ताव ठीक काम करेगा। मुझे कोई विकल्प नहीं दिख रहा है, है ना? – asksol

उत्तर

30

आप एक अजवाइन चेन के साथ ऐसा कर सकते हैं। https://celery.readthedocs.org/en/latest/userguide/canvas.html#chains

@task() 
def add(a, b): 
    time.sleep(5) # simulate long time processing 
    return a + b 

श्रृंखलन काम देखें:

# import chain from celery import chain 
# the result of the first add job will be 
# the first argument of the second add job 
ret = chain(add.s(1, 2), add.s(3)).apply_async() 

# another way to express a chain using pipes 
ret2 = (add.s(1, 2) | add.s(3)).apply_async() 

... 

# check ret status to get result 
if ret.status == u'SUCCESS': 
    print "result:", ret.get() 
+0

हाय, मैं इस सुझाव की तरह एक जंजीर प्रक्रिया का परिणाम प्राप्त करने की कोशिश कर रहा हूं लेकिन चेतावनी प्राप्त करें: '2016-09-15 16: 20: 52,684: चेतावनी/कार्यकर्ता -7]/लाइब्रेरी/पायथन/2.7/साइट- पैकेज/अजवाइन/परिणाम.py: 45: रनटाइम चेतावनी: किसी कार्य के भीतर परिणाम.get() को कभी भी कॉल न करें! 'http: // docs.celeryq.org/en/नवीनतम/userguide/task.html # कार्य-सिंक्रोनस-सबटास्क' 'सेलेरी 3.2 में देखें, इसके परिणामस्वरूप अपवाद होने के बजाय उठाया जा सकता है चेतावनी। मैं 'परिणाम = श्रृंखला (..., ..., ...) के रूप में जंजीर उप-कार्य का उपयोग कर रहा हूं। देरी()।() प्राप्त करें() 'क्या आप समझा सकते हैं कि उप-कार्यकुशलों को संभालने के बावजूद यह समस्या क्यों उठाती है श्रृंखला विधि? – user305883

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