2013-01-21 39 views
6

अजवाइन में, क्या एक कार्यकर्ता (स्वचालित) कार्य करने के लिए एक सरल तरीका है जिसे मैं स्वचालित रूप से किसी कार्यकर्ता को पुनरारंभ करने के लिए उपयोग कर सकता हूं?अजवाइन कार्यकर्ता को पुनरारंभ करने के लिए पायथन सेलेरी कार्य

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

योजना प्रत्येक मशीन के लिए के लिए है:

  • प्रबंधन नोड [कतार: प्रबंधन, मशीन विशिष्ट] -, मशीन पर श्रमिकों के बाकी प्रबंध नई नोड्स को लाने और पुराने हत्या के लिए जिम्मेदार आवश्यक के रूप में
  • कर्मचारी नोड्स [कतार: गिट संशोधन विशिष्ट, कार्यकर्ता विशिष्ट, मशीन विशिष्ट] - वास्तव में काम करने के लिए जिम्मेदार।

यह कोड मैं की जरूरत है की तरह लग रहा में dist_packages/अजवाइन/bin/celeryd_multi.py कहीं है, लेकिन स्रोत नहीं बल्कि कार्यकर्ताओं शुरू करने के लिए अपारदर्शी है, और मैं नहीं बता सकता कि यह कैसे काम करने के लिए चाहिए था या यह कहाँ है वास्तव में नोड्स शुरू कर रहा है। (ऐसा लगता है कि शट डाउन_नोड्स प्रक्रियाओं को मारने के लिए कॉल करने के लिए सही कोड है, और मैं धीरे-धीरे अपने तर्कों को समझने के लिए अपने रास्ते को डीबग कर रहा हूं)

क्या कोई फ़ंक्शन/फ़ंक्शन restart_nodes (स्वयं, नोड्स) कहीं कहीं मैं कॉल कर सकता हूं या क्या मैं पाइथन के भीतर से खोल स्क्रिप्ट चला रहा हूं?

/साथ ही, क्या प्रक्रियाओं को मारने और पुनरारंभ करने से पाइथन में स्रोत को फिर से लोड करने का एक आसान तरीका है? अगर मुझे पता था कि मॉड्यूल को फिर से लोड करना वास्तव में काम करता है (प्रयोग कहते हैं कि यह नहीं करता है। फ़ंक्शन में परिवर्तन तब तक नहीं होते जब तक कि मैं प्रक्रिया को पुनरारंभ नहीं करता), मैं केवल प्रबंधन नोड्स के साथ संकेत के बजाय ऐसा करता हूं।

संपादित करें: अब मैं बंद कर सकता हूं, प्रसारण के लिए धन्यवाद (धन्यवाद मिहेल। अगर मेरे पास अधिक प्रतिनिधि था, तो मैं ऊपर उठूंगा)। पुनरारंभ करने के लिए कोई तरीका? पूल_स्टार्ट है, लेकिन यह नोड को नहीं मारता है, जिसका अर्थ है कि यह स्रोत को अपडेट नहीं करेगा।

मैं celery.bin.celeryd: वर्कर कॉमांड() रन() में दृश्यों के पीछे के कुछ पीछे देख रहा हूं, लेकिन रन कॉल से पहले और बाद में कुछ अजीब चीजें चल रही हैं, इसलिए मैं ' टी बस उस समारोह को कॉल करें और किया जाए क्योंकि यह दुर्घटनाग्रस्त हो जाता है। यह सिर्फ एक और पायथन स्क्रिप्ट चलाने के लिए एक पायथन स्क्रिप्ट से शेल कमांड को कॉल करने के लिए 0 समझ बनाता है, और मुझे विश्वास नहीं है कि मैं ऐसा करने वाला पहला व्यक्ति हूं।

+0

"। Pool_restart नहीं है, लेकिन उस नोड, कि यह स्रोत अपडेट नहीं होगा जिसका मतलब है कि मारने नहीं है" - वास्तव में आप चाहते हैं कि इसका समाधान हो, लेकिन ऐसा लगता है कि यह यहां अनसुलझा रहा है। – AlanSE

+0

आप अपने कर्मचारियों को कैसे व्यवस्थित करते हैं? क्या आप systemd का उपयोग कर रहे हैं? आपके पास execRestart कार्य हो सकता है और कॉल systemctl celery.service को पुनरारंभ करें उदाहरण के लिए तैनाती – shalbafzadeh

+0

के अंत में उस कंपनी को 4 साल पहले चला गया था, इसलिए इससे कोई फर्क नहीं पड़ता और मैं भूल जाता हूं। –

उत्तर

2

आप सेलेरी के broadcast functionality का उपयोग करने का प्रयास कर सकते हैं।

यहाँ आप कुछ अच्छे उदाहरण देख सकते हैं: https://github.com/mher/flower/blob/master/flower/api/control.py

+0

हाफवे वहां। मैं बंद कर सकता हूं, लेकिन मैं नहीं ला सकता। धन्यवाद। –

+0

क्या 'पूल_स्टार्ट' संदेश नौकरी करेगा? शायद यह नए कार्यों को पकड़ नहीं पाएगा, लेकिन यह मौजूदा ऑनिस के लिए अपडेट समझ जाएगा। मैं 100% निश्चित नहीं हूं जब सेलेरी विशिष्ट कॉल करने योग्य के लिए प्रतीकात्मक कार्य नाम बांधता है।यदि यह पूल में ही होता है तो फिर से शुरू करने से आपको कार्य मिल जाएगा, जहां तक ​​मुझे यह मिल जाएगा। –

+4

नहीं। एक कार्य परिभाषित करें (x, y) जो x + y लौटा। अजवाइन शुरू किया। 'add.delay (4,4)' रिटर्न 8. संपादित x * y में संपादित किया गया। 'प्रसारण ('pool_restart')'। 'add.delay (4,4) 'अभी भी 16 के बजाय 8 लौटाता है। ध्यान दें कि यह व्यवहार' --autoreload' ध्वज के नीचे भी देखा गया था। –

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