2014-10-07 12 views
16

मेरा ऐप किसी पृष्ठ पर फ़ोन नंबरों का एक समूह एकत्र करता है। एक बार जब उपयोगकर्ता सबमिट बटन हिट करता है तो मैं प्रत्येक नंबर पर कॉल करने के लिए एक सेलेरी कार्य बनाता हूं और एक अनुस्मारक संदेश देता हूं, फिर उन्हें उस पृष्ठ पर रीडायरेक्ट करता हूं जहां वे कॉल के बारे में लाइव अपडेट देख सकते हैं। मैं प्रत्येक कॉल की स्थिति अपडेट करने के लिए वेब सॉकेट का उपयोग कर रहा हूं और कार्यों को सिंक्रनाइज़ करने के लिए आवश्यक है क्योंकि मेरे पास केवल एक नंबर से डायल करने की पहुंच है।सेलेरी कार्यों को बनाएँ, फिर सिंक्रनाइज़ेशन चलाएं

तो एक बार पहला कॉल/कार्य पूरा हो जाने के बाद, मैं चाहता हूं कि अगला व्यक्ति आग लग जाए।

मैंने CELERY_ALWAYS_EAGER सेटिंग्स पर एक नज़र डाली लेकिन यह केवल पहले पुनरावृत्ति के माध्यम से चला गया और बंद कर दिया।

@task 
def reminder(number): 
    # CODE THAT CALLS NUMBER HERE.... 

def make_calls(request): 
    for number in phone_numbers:      
     reminder.delay(number)  

    return redirect('live_call_updates') 
+0

क्या आपके पास प्रति फोन नंबर एक सेलरी कार्य है, या क्या आप असीमित रूप से कॉल को एक-एक करके शुरू करने के लिए अजवाइन का उपयोग कर रहे हैं? – srj

उत्तर

4

यदि आप प्रत्येक कॉल आग एक के बाद एक चाहते हैं, तुम क्यों लपेट न सब एक कार्य में कॉल

@task 
def make_a_lot_of_calls(numbers): 
    for num in numbers: 
     # Assuming that reminder blocks till the call finishes 
     reminder(number) 

def make_calls(request): 
    make_a_lot_of_calls.delay(phone_numers)       
    return redirect('live_call_updates') 
+0

सेलेरी के साथ उपयोग के लिए कार्य को फिर से लिखने के लिए कई बार उचित हो सकता है, लेकिन यहां ऐसा लगता है कि एक कॉल करना एक कार्य के लिए उपयुक्त परिभाषा है। – JivanAmara

16

आप celery DOCS on tasks आप देखते हैं कि synchronosuly एक कार्य कॉल करने के लिए को देखें, तो आप apply_async() विधि के विपरीत लागू() विधि का उपयोग करते हैं।

तो आपके मामले में आप इस्तेमाल कर सकते हैं:

reminder.apply(args=[number]) 

डॉक्स भी ध्यान रखें कि:
@JivanAmara को If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

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

+1

ध्यान रखें कि लागू() का उपयोग कर एक कार्य चलाना सिंक्रनाइज़ेशन चलाएगा, लेकिन स्थानीय रूप से भी चलाएगा। यदि आप प्रसंस्करण कर रहे कई मशीनों का इरादा रखते हैं तो यह एक समस्या है। – JivanAmara

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