2012-08-23 25 views
5

में जॉब परिणाम जोड़ना मैं अजवाइन का उपयोग कर एक सॉफ्टवेयर अपग्रेड सिस्टम पर काम कर रहा हूं। मेरे पास एक उपयोग मामला है कि मैं साफ-सफाई लागू करने के लिए संघर्ष कर रहा हूं। यहाँ मेरी जॉब कर रहे हैं:सेलेरी

device_software_updates (DEVICE_ID)

returns a list of software updates that need to be installed on a device 

installed_device_software (DEVICE_ID)

returns the software modules that are currently installed on a device 

latest_device_software (DEVICE_ID)

returns the latest software versions available for a device 

software_updates (installed_software, latest_software)

returns the latest software modules that are not installed 

शुद्ध अजगर में, device_software_updates के कार्यान्वयन की तरह

def device_software_updates(device_id): 
    return software_updates(installed_device_software(device_id), 
          latest_device_software(device_id)) 

लग सकता है क्या अजवाइन में इस लागू करने के लिए स्पष्ट तरीका है, 3.0? मैं समूहों का उपयोग कर कुछ करना चाहता हूं। मेरे वर्तमान कार्यान्वयन इस तरह दिखता है:

def device_software_updates(device_id): 
    return (
     group(installed_device_software.s(device_id), 
       latest_device_software.s(device_id)) | 
     software_updates.s() 
    )() 

दुर्भाग्य से, इसका मतलब है कि software_updates की argspec software_updates(arg_list) जो आदर्श नहीं है।

उत्तर

6

मुझे विश्वास है कि तार का उपयोग करके इसे संभालने का सही तरीका होगा।

http://docs.celeryproject.org/en/latest/userguide/canvas.html#groups पर अजवाइन प्रलेखन,

एक तार एक काम है कि केवल एक में कार्य taskset क्रियान्वित समाप्त कर दिया है की सब के बाद निष्पादित करता है अनुसार।

...

एक तार सिर्फ एक समूह की तरह, लेकिन एक कॉलबैक के साथ है। एक तार में एक हेडर समूह और एक शरीर होता है, जहां शरीर एक कार्य है जिसे शीर्षलेख में सभी कार्यों को पूरा करने के बाद निष्पादित करना चाहिए।

यहाँ, एक टूट, (अजवाइन प्रलेखन से) लाइन उदाहरण के द्वारा लाइन

callback = tsum.subtask() 
header = [add.subtask((i, i)) for i in xrange(100)] 
result = chord(header)(callback) 
result.get() 

आपके मामले में है कि आप की तरह कुछ इसी तरह, कर सकता है:

@celery.task 
def device_software_updates(): 
    callback = software_updates.subtask() 
    header = [ 
       installed_device_software.subtask(device_id), 
       latest_device_software.s(device_id) 
      ] 
    result = chord(header)(callback) 
    return result.get() 
+6

तुम कभी चाहिए कार्य के अंदर से परिणाम.get() कॉल करें, आपको एक डेडलॉक मिल सकता है। http://celery.readthedocs.org/en/latest/_modules/celery/result.html। – rajat

+0

@rajat क्या आप शायद एक सही उदाहरण प्रदान कर सकते हैं? – guival

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