2012-03-10 32 views
24

हम ऑफ़लाइन कार्यों को प्रबंधित करने के लिए हमारे Django वेबएप के साथ सेलेरी का उपयोग करते हैं; इनमें से कुछ कार्य 120 सेकंड तक चल सकते हैं।कार्यों में देरी किए बिना सेलेरी को शानदार ढंग से पुनरारंभ कैसे करें

जब भी हम कोई कोड संशोधन करते हैं, तो हमें इसे नए पायथन कोड को पुनः लोड करने के लिए सेलेरी को पुनरारंभ करने की आवश्यकता होती है। हमारा वर्तमान समाधान मुख्य सेलरी प्रक्रिया (kill -s 15 `cat /var/run/celeryd.pid`) में एक सिगरेट भेजने के लिए है, फिर इसे मरने के लिए प्रतीक्षा करें और इसे पुनरारंभ करें (python manage.py celeryd --pidfile=/var/run/celeryd.pid [...])।

क्योंकि लंबे समय से चल रहे कार्यों की

, यह आम तौर पर बंद एक या दो मिनट, जिसके दौरान कोई नए कार्य कार्रवाई की जाती है ले जाएगा, वर्तमान में साइट पर उपयोगकर्ताओं के लिए एक ध्यान देने योग्य देरी के कारण होता है। मैं सेलेरी को बंद करने के लिए कहने का एक तरीका ढूंढ रहा हूं, लेकिन फिर नए कार्यों को चलाने के लिए तुरंत एक नया सेलेरी इंस्टेंस लॉन्च करें।

हालात नहीं कि किया काम: एक गर्म बंद करके इस वजह से अजवाइन को प्रयास करने के लिए "पुनः आरंभ" और फिर खुद को दोबारा लॉन्च:

  • मुख्य प्रक्रिया को SIGHUP भेजा जा रहा है। न केवल इसमें काफी समय लगता है, यह काम भी नहीं करता है, क्योंकि स्पष्ट रूप से पुरानी प्रक्रिया से पहले नई प्रक्रिया शुरू होती है, इसलिए नया व्यक्ति ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214) शिकायत करता है और तुरंत मर जाता है। (यह सेलरी में एक बग की तरह दिखता है; मेरे पास let them know है।)
  • मुख्य प्रक्रिया में SIGTERM भेजना और फिर तुरंत एक नया उदाहरण लॉन्च करना: Pidfile के साथ एक ही समस्या।
  • पूरी तरह से पिडफाइल को अक्षम करना: इसके बिना, हमारे पास यह कहने का कोई तरीका नहीं है कि 30 सेलेरी प्रक्रिया मुख्य प्रक्रिया है जिसे सिगरेट भेजा जाना चाहिए जब हम इसे गर्म शट डाउन करना चाहते हैं। यह जांचने का कोई भरोसेमंद तरीका नहीं है कि मुख्य प्रक्रिया अभी भी जिंदा है या नहीं।
+0

शायद http://stackoverflow.com/questions/9764913/how-do-i-restart-celery-workers-gracefully/16717128#16717128 का मेरा उत्तर आप मदद करता है। – guettli

उत्तर

0

आप एक कस्टम पीआईडी ​​फ़ाइल नाम के साथ इसे लॉन्च कर सकते हैं। संभावित रूप से समयबद्ध, और उस कुंजी को जानने के लिए कि कौन सा पीआईडी ​​मारना है?

CELERYD_PID_FILE="/var/run/celery/%n_{timestamp}.pid"

^मैं टाइमस्टैम्प वाक्य रचना नहीं जानता लेकिन हो सकता है आप कर सकते हैं या आप इसे पा सकते हैं?

फिर किसी भी पुराने पिड्स को मारने और एक नया लॉन्च करने के लिए वर्तमान सिस्टम समय का उपयोग करें?

+0

मुझे संदेह है कि आपको इस प्रश्न में तकनीकों में से एक के संयोजन की आवश्यकता होगी। अपने ब्रोकर के आधार पर आप एक टाइमस्टैम्प आधारित pidfile के साथ एक नया अजवाइन शुरू करने के लिए (का उपयोग करते हुए '--pidfile ='), तो 'SIGTERM' अन्य सभी चल अजवाइन प्रक्रियाओं के लिए उन्हें बंद गर्म करने के लिए प्राप्त करने के लिए भेजने के लिए सक्षम होना चाहिए (हालांकि ध्यान दें कि वास्तव में केवल एक होना चाहिए, जब तक कि आप इसे आजमाएं, जबकि पुराने सेलरीड अभी भी गर्म शट डाउन के माध्यम से जा रहा है)। –

4

सेलेरीड में --autoreload विकल्प है। सक्षम होने पर, अजवाइन कार्यकर्ता (मुख्य प्रक्रिया) सेलेरी मॉड्यूल में परिवर्तनों का पता लगाएगा और सभी कार्यकर्ता प्रक्रियाओं को पुनरारंभ करेगा। इसके विपरीत संकेत SIGHUP करने के लिए, autoreload प्रत्येक प्रक्रिया स्वतंत्र रूप से जब वर्तमान क्रियान्वित काम खत्म पुन: प्रारंभ होता। इसका मतलब है, जबकि एक कार्यकर्ता प्रक्रिया शेष प्रक्रियाओं को पुन: प्रारंभ कर रहा है कार्य निष्पादित कर सकते हैं।

http://celery.readthedocs.org/en/latest/userguide/workers.html#autoreloading

+14

हालांकि '--autoreload' को लाइव तैनाती के लिए सलाह नहीं दी जा रही है। –

+1

उत्पादन में यह इस तरह http://www.indelible.org/ink/python-reloading/ – mher

3

मैं हाल ही में SIGHUP साथ बग ठीक करने के बाद: https://github.com/celery/celery/pull/662

+0

धन्यवाद कस्टम reloader के साथ प्रयोग किया जा सकता है! हालांकि, आपका फिक्स इस तथ्य को नहीं बदलेगा कि SIGHUP सभी कार्यों को समाप्त करने और फिर से लॉन्च करने से पहले समाप्त होने की प्रतीक्षा करता है, फिर से देरी से मैं बचने की कोशिश कर रहा हूं। अपने फिक्स का लाभ उठाने के तरीकों के बारे में विचार और फिर भी प्रतीक्षा किए बिना इसे फिर से लॉन्च करना बहुत अच्छा होगा ... – nitwit

+0

इस प्रकार मैंने समस्या हल की। मैंने एक अलग कतार में हर लंबे समय तक चलने वाला कार्य (वीडियो रूपांतरण, ईमेल वितरण) रखा है, जिसे एक अलग कार्यकर्ता द्वारा संसाधित किया जाता है। इसलिए जब मैं सभी श्रमिकों को SIGHUP भेजता हूं, तो मुझे पता है कि डिफ़ॉल्ट कतार से कार्यकर्ता प्रसंस्करण कार्य लंबे समय तक अवरुद्ध नहीं होते हैं, क्योंकि केवल छोटे कार्य होते हैं। वीडियो रूपांतरण छोटे कार्यों को अवरुद्ध नहीं करता है। थोड़ी देर के लिए केवल वीडियो रूपांतरण कतार अवरुद्ध है। लेकिन यह मेरे मामले में स्वीकार्य है। –

+0

तो कुछ परीक्षण के बाद, मैंने पाया कि आपका फिक्स सिगरेट समस्या को भी ठीक करता है। '-s SIGTERM मारने' 'बिल्ली/var/चलाने/celeryd.pid'' && अजगर manage.py celeryd --pidfile: तो मैं अंत में का उपयोग कर अपने ठीक विलय और पुन: प्रारंभ अजवाइन से एक बार और सभी के लिए इस समस्या को हल करने में कामयाब =/var/चलाने/celeryd.pid [...] ' आपको लगता है कि रख सकते हैं, तो आपका जवाब में, मैं इसे स्वीकार करेंगे! – nitwit

2
rm *.pyc 

इस कारण अद्यतन कार्य पुनः लोड करना होगा। मैंने हाल ही में इस चाल की खोज की, मुझे उम्मीद है कि कोई बुरा दुष्प्रभाव नहीं हैं।

0

अच्छी तरह से आप अजवाइन के गर्म शट डाउन के लिए SIGHUP (1) का उपयोग कर रहे हैं। मुझे यकीन है कि अगर यह वास्तव में एक गर्म शटडाउन का कारण बनता है नहीं कर रहा हूँ। लेकिन सिगिनट (2) गर्म शट डाउन का कारण बनता है। SIGHUP के स्थान पर SIGINT आज़माएं और फिर अपनी स्क्रिप्ट में मैन्युअल रूप से सेलेरी शुरू करें (मुझे लगता है)।

1

एक छोटी सी देर हो गई, लेकिन यह है कि को हटाने फ़ाइल celerybeat.pid बुलाया द्वारा तय कर सकते हैं।

मेरे लिए काम किया।