2013-03-06 38 views
5

के साथ अजवाइन में कार्य प्राथमिकता मैं अजवाइन के साथ एक वितरित नौकरी निष्पादन प्रणाली को कार्यान्वित करना चाहता हूं। यह देखते हुए कि खरगोश एमक्यू प्राथमिकताओं का समर्थन नहीं करता है और मुझे इस सुविधा की दर्दनाक रूप से आवश्यकता है, मैं अजवाइन + लाल हो गया।रेडिस

मेरी स्थिति में, कार्य हार्डवेयर से निकटता से संबंधित हैं, उदाहरण के लिए, कार्य ए केवल वर्कर 1 पर ही चला सकता है क्योंकि केवल वर्कर 1 के पीसी को आवश्यक हार्डवेयर मिल गया है। मैंने प्रत्येक कार्यकर्ता की CONCURRENCY को 1 पर सेट किया ताकि एक कार्यकर्ता प्रत्येक बार केवल एक कार्य चलाएगा। प्रत्येक कार्य में लगभग 2 मिनट लगते हैं।

प्राथमिकता सुविधा, सभी मैं जब apply_async() बुला, उदाहरण के apply_async(priority=0) और apply_async(priority=9) के लिए priority तर्क जोड़ने की कोशिश की के पहले लागू करने के लिए। इस परीक्षण में मैंने COCURRENCY = 1 के साथ केवल एक वर्कर लॉन्च किया, और विभिन्न कार्यों के साथ 10 कार्यों को एक-एक करके लात मार दिया। मुझे apply_async(priority=0) द्वारा लात मारने वाले कार्यों को प्राथमिकता में चलाने की उम्मीद है, लेकिन दुर्भाग्यवश वे अभी भी लात मारने के आदेश के रूप में शुरू हो गए हैं।

फिर मैं कुछ काम करने की कोशिश करता हूं। मैंने प्रत्येक कार्य को क्लोन किया, इसलिए प्रत्येक के लिए मेरे पास task_high और task_low है, @celery.task(priority=0) और @celery.task(priority=1) द्वारा सजाया गया है। तब मैंने उपरोक्त के समान परीक्षण किया, इस बार यह बेहतर था, जब लात मारने का आदेश "एचएच-एलएलएलएल-एचएचएचएच" होता है, तो वास्तविक आदेश "एचएच-एल-एच-एच-एल-एच-एल-एल-एच" होता है। मुझे लगता है कि रेडिस ने कुछ शेड्यूलिंग और बैलेंसिंग काम किया था।

लेकिन यह अभी भी मेरी अपेक्षाओं को पूरा नहीं कर सकता है। मुझे आशा है कि "एचएचएचएचएच-एलएलएलएल" जैसे ऑर्डर प्राप्त करें, क्योंकि कुछ कार्यों के लिए मेरे पास आवश्यक हार्डवेयर के साथ केवल एक उचित मशीन है और आशा है कि जितनी जल्दी हो सके उच्च प्राथमिकता वाले कार्य को चलाने के लिए।

मैंने इंटरनेट पर चारों ओर अन्य काम की खोज की है, उदाहरण के लिए दो कतारों का उपयोग करना, एक उच्च प्राथमिकता वाले कार्यों के लिए और दूसरे को कम प्राथमिकता के लिए, और पूर्व के लिए 2 मशीनों और बाद के लिए 1 मशीन का उपयोग करना। लेकिन चूंकि मेरा हार्डवेयर काफी सीमित है, यह मेरे लिए काम नहीं करता है।

क्या आप कुछ सुझाव दे सकते हैं?

उत्तर

13

सेलेरी रेडिस परिवहन प्राथमिकता क्षेत्र, का सम्मान करता है लेकिन रेडिस के पास प्राथमिकताओं की कोई धारणा नहीं है।

प्राथमिकता समर्थन प्रत्येक कतार के लिए एन सूचियां बनाकर और BRPOP कमांड में उस क्रम का उपयोग करके कार्यान्वित किया जाता है। मैं n कहता हूं क्योंकि यहां 10 (0-9) प्राथमिकता स्तर हैं, फिर भी संसाधनों को बचाने के लिए डिफ़ॉल्ट रूप से 4 स्तरों में समेकित हैं। इसका मतलब है कि celery नाम के एक कतार वास्तव में 4 कतारों में विभाजित किया जाएगा:

['celery0', 'celery3`, `celery6`, `celery9`] 

आप अधिक प्राथमिकता के स्तर आप priority_steps परिवहन विकल्प सेट कर सकते हैं:

BROKER_TRANSPORT_OPTIONS = { 
    'priority_steps': list(range(10)), 
} 

जिसके अनुसार, ध्यान दें कि यह है कि सर्वर स्तर पर लागू प्राथमिकताओं के रूप में कभी भी उतना अच्छा नहीं होगा, और यह अनुमानित रूप से अनुमानित हो सकता है। लेकिन यह अभी भी आपके आवेदन के लिए पर्याप्त अच्छा हो सकता है।

+0

विवरण के लिए धन्यवाद, लेकिन मैं आदेश प्राप्त करने के लिए क्या कर सकता हूं? क्या मुझे सिर्फ 'प्राथमिकता_स्टेप्स' बदलना चाहिए? –

+0

आप इसे अभी आज़मा सकते हैं। डिफ़ॉल्ट प्राथमिकता चरणों के साथ उन 0 और 1 को केवल 0 में समेकित किया जाएगा। – asksol

+0

ठीक है धन्यवाद, मैंने कार्य कम करने के लिए प्राथमिकता 0 और प्राथमिकता 9 के लिए प्राथमिकता 0 के साथ प्रयास किया है, अब यह बहुत बेहतर लगता है, हालांकि कभी-कभी प्राथमिकता 9 वाले कुछ कार्य प्राथमिकता वाले 0 से पहले भी चलते हैं। मुझे नहीं पता कि कुछ है या नहीं मेरी कॉन्फ़िगरेशन के साथ गलत है या यह रेडिस है जो कुछ संतुलित नौकरी करता है। –