2011-05-04 14 views
5

मेरे पास एक django साइट है। अंतिम उपयोगकर्ता द्वारा कुछ क्रियाएं समूह में शेष उपयोगकर्ताओं को ईमेल भेजती हैं।Django गैर अवरुद्ध ईमेल? थ्रेडसाइड थ्रेडिंग। थ्रेड या सबप्रोसेस?

जब उपयोगकर्ताओं की संख्या होनी चाहिए> 20 यह अनुरोध चक्र में 1-3 सेकंड जोड़ सकता है, जो मुझे पसंद नहीं है। मैं एक गैर-अवरुद्ध समारोह से ईमेल भेजने में सक्षम होना चाहता हूं।

मुझे पता है कि संयोजन में खरगोश एमक्यू और सेलेरी इसे हल कर सकते हैं, लेकिन 200 उपयोगकर्ताओं के साथ जो अधिक इंजीनियरिंग की तरह दिखते हैं और इसमें दो और अनुप्रयोग जोड़े जाते हैं जिन्हें मुझे स्थापित करना, समझना और बेबीसिट करना है।

मैं बहुत शोध किया है, और ऐसा लगता है कि दोनों threading.Thread और उपप्रक्रिया एक गैर अवरुद्ध कॉल रैप करने के लिए तरीके होगा। क्या मुझे ऐसा करने का एक स्पष्ट तरीका याद आ रहा है? क्या थ्रेडिंग या थ्रेडिंग या सबप्रोसेस दृष्टिकोण का उपयोग करने के लिए डाउनसाइड्स हैं?

धन्यवाद, टेड

+2

यदि आप थ्रेडिंग का उपयोग करके अपना खुद का लिखते हैं। थ्रेड या सबप्रोसेस, तो आपको बेबीसिटिंग लिखनी होगी। इसे क्यों लेते हैं? क्यों नीलरी का उपयोग करें? (अपना खुद का लुत्फ उठाकर, मैं आपको बता सकता हूं कि यह एक खेदजनक निर्णय है।) जब सेलेरी पहले से ही लिखी गई है तो अपना खुद का रोल क्यों करें? –

+0

किस प्रकार की बेबीसिटिंग की आवश्यकता होगी? मेरी समझ यह है कि धागे पर कचरा इकट्ठा होता है। – Ted

+0

धागे जादू नहीं हैं। वे I/O संसाधनों के लिए संघर्ष करते हैं। (सभी धागे प्रक्रिया-स्तरीय संसाधन साझा करते हैं) जब वे मेलमेल बुरी तरह व्यवहार करते हैं तो वे लटकते हैं। आपको अक्सर पूल बनाना और टाइमआउट, डेडलॉक्स और लाइफॉक्स (भुखमरी) का प्रबंधन करना होगा। मैं नहीं देखता कि कैसे "बेबीसिटिंग" धागे से दूर चला जाता है। यदि आप बच्चों की देखभाल से छुटकारा पा सकते हैं, तो सवाल क्यों पूछें? बस अपने धागे समाधान को लागू करें। –

उत्तर

9

कुछ अन्य बाह्य प्रक्रिया के लिए काम उतारने वास्तव में ऐसा करना सही है, और एक बार आप इसे कर लिया, तो पिछली बार जब आप यह कर होने की संभावना नहीं है। अजवाइन/RabbitMQ एक सभ्य समाधान है, और अच्छी बात यह है कि वे पहले से ही वहां हैं। हालिया खरगोश एमक्यू रिलीज में एक सभ्य वेब-आधारित प्रबंधन ऐप और एक सभ्य प्रबंधन API है जो बच्चों को बहुत आसान बना देगा, और अजवाइन Django ऐप्स में अजवाइन बहुत अच्छी तरह से काम करता है।

आप उपप्रक्रिया या सूत्रण के साथ ऐसा कर सकते हैं, लेकिन ईमानदारी से, मुझे लगता है कि एक बुरी आदत में पाने के लिए है। दुर्भाग्यवश, यदि आप चीजों को ऑफ़लोड करना नहीं चाहते हैं तो वे जो करना चाहते हैं, वे करने के लिए वे सबसे सरल तरीके हैं।

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

मैं कहता हूं कि खरगोश/अजवाइन के साथ जाओ। ऐसा लगता है कि यह उतना काम नहीं है, और यह आगे बढ़ने लायक है।

+1

यदि रबीटएमक्यू/सेलेरी संयोजन में गेटो एसिंक ईमेल से कम काम करते हैं, तो ऐसा लगता है जैसे मैंने अनुमान लगाया है कि उन्हें चलाने में क्या शामिल है। धन्यवाद। – Ted

0

आप लंबे समय से के बाद से इस समस्या का समाधान है, लेकिन मैं अभी ठीक उसी समस्या थी, और इस तेज तरीका आगे 'यहूदी बस्ती async ईमेल' आप का उल्लेख किया गया था:

http://djangosnippets.org/snippets/1864/

मैं जोड़ा एक monkeypatch, here वर्णित, थ्रेडिंग अपवाद से छुटकारा पाने:

import threading 
threading._DummyThread._Thread__stop = lambda x: 42 

और अब बॉब है, जैसा कि वे कहते हैं, मेरे चाचा।

0

अजवाइन के लिए ऑफलोडिंग से बहुत आसान है, तो आप हमेशा कोशिश कर सकते हैं (django में शामिल) Signals मॉड्यूल, बस आपको जो चाहिए उसे लगता है।

+0

संकेत अभी भी एक अवरुद्ध ऑपरेशन है, और अनुरोध के साथ ऑनलाइन काम करते हैं। DRY ऐप्स को DRY रखने के लिए सिग्नल बहुत अच्छे हैं, लेकिन जब तक आप एक कतार में नौकरी को पॉप करने के लिए सिग्नल का उपयोग नहीं कर रहे हैं, जैसे कि अजवाइन और खरगोश। – bmelton

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