2012-10-10 13 views
11

क्या मैं एक सेलरी Group को मानचित्र में छतरी कार्य/वर्कफ़्लो को कम करने के रूप में आदिम का उपयोग कर सकता हूं?नक्शा में उपयोग के लिए सेलेरी समूह कार्य/वर्कफ़्लो को कम करने के लिए

या अधिक विशिष्ट: क्या समूह में उप-कार्य एकाधिक सर्वर पर एकाधिक श्रमिकों पर चलाया जा सकता है?

डॉक्स से

:

However, if you call apply_async on the group it will send a special 
grouping task, so that the action of calling the tasks happens in a worker 
instead of the current process 

कार्यों यह सूचित करते हैं सब एक कार्यकर्ता को भेज रहे हैं लगता है कि ...

से पहले 3.0 (और अब भी) एक एक TaskSet में उप-कार्य बंद आग सकता है एकाधिक सर्वर पर चलेंगे। समस्या यह निर्धारित कर रही है कि सभी कार्यों ने निष्पादन समाप्त कर दिया है या नहीं। यह आमतौर पर सभी उप-कार्यों को मतदान करके किया जाता है जो वास्तव में सुरुचिपूर्ण नहीं है। मुझे आश्चर्य है कि ग्रुप आदिम का उपयोग इस समस्या को कम करने के लिए किया जा सकता है।

+0

कम से कम सेलरी 3.1 में नियमित 'समूह' कमांड के साथ कार्यों को पूरी तरह से ठीक करता है, ऐसा लगता है कि ऊपर दिए गए कथन को दस्तावेज़ों से हटा दिया गया था – Grozz

उत्तर

23

मुझे पता चला कि इस तरह के मानचित्र के लिए Chords का उपयोग करना समस्या की तरह कम हो सकता है।

@celery.task(name='ic.mapper') 
def mapper(): 
    #split your problem in embarrassingly parallel maps 
    maps = [map.s(), map.s(), map.s(), map.s(), map.s(), map.s(), map.s(), map.s()] 
    #and put them in a chord that executes them in parallel and after they finish calls 'reduce' 
    mapreduce = celery.chord(maps)(reduce.s())  
    return "{0} mapper ran on {1}".format(celery.current_task.request.id, celery.current_task.request.hostname) 

@celery.task(name='ic.map') 
def map(): 
    #do something useful here 
    import time 
    time.sleep(10.0) 
    return "{0} map ran on {1}".format(celery.current_task.request.id, celery.current_task.request.hostname) 

@celery.task(name='ic.reduce') 
def reduce(results): 
    #put the maps together and do something with the results 
    return "{0} reduce ran on {1}".format(celery.current_task.request.id, celery.current_task.request.hostname) 

नक्शाकार तीन कार्यकर्ताओं/सर्वर की एक क्लस्टर पर निष्पादित किया जाता है जब वह पहली बार नक्शाकार जो आपकी समस्या को विभाजन निष्पादित करता है और नए उप-कार्य है कि फिर से दलाल को प्रस्तुत कर रहे बनाता है। ये समानांतर में चलते हैं क्योंकि कतार सभी ब्रोकरों द्वारा खाई जाती है। इसके अलावा एक तार कार्य बनाया जाता है जो सभी मानचित्रों को यह देखने के लिए चुनाव करता है कि वे समाप्त हो गए हैं या नहीं। जब किया गया कार्य कम किया जाता है जहां आप अपने परिणामों को एक साथ वापस कर सकते हैं।

सभी में: हाँ यह संभव है। सब्जी के लोगों के लिए धन्यवाद!