2009-10-29 15 views
6

मेरे पास एक सामान्य Django साइट चल रही है। इसके अलावा, एक और मोड़ की प्रक्रिया है, जो जैबर उपस्थिति अधिसूचनाओं को सुनती है और डीजेगो के ओआरएम का उपयोग करके डीजेगो डीबी अपडेट करती है।ट्विज के भीतर से Django डीबी ऑपरेशन को कैसे रोकें?

अब तक यह काम करता है के रूप में मैं सिर्फ इसी Django मॉडल फोन (सही सेटिंग्स वातावरण की स्थापना करने के बाद)। हालांकि, यह ट्विस्ट ऐप को अवरुद्ध करता है, जो मैं नहीं चाहता हूं।

जैसा कि मैंने नए मुड़ के लिए मैं नहीं जानता, सबसे अच्छा तरीका है एक गैर अवरुद्ध रास्ता deferreds का उपयोग करने में (अपने ORM के माध्यम से) Django डीबी तक पहुँचने के लिए होगा क्या कर रहा हूँ।

  1. deferredGenerator?
  2. twisted.enterprise.adbapi? (ओआरएम को बाधित करें?)
  3. ???

उपस्थिति संदेश पार्स किया गया है अगर मैं Django डीबी में बचाने के लिए है कि jid_str साथ उपयोगकर्ता ऑनलाइन/ऑफ़लाइन है (Django मॉडल UserProfile उपयोग करते हुए) चाहते हैं। मुझे लगता है कि समारोह के साथ कार्य करें:

def django_useravailable(jid_str, user_available): 
    try: 
     userhost = jid.JID(jid_str).userhost() 
     user = UserProfile.objects.get(im_jabber_name=userhost) 
     user.im_jabber_online = user_available 
     user.save() 
     return jid_str, user_available 
    except Exception, e: 
     print e 
    raise jid_str, user_available,e 

वर्तमान में, मैं के साथ यह आह्वान: "। मैं एक सामान्य Django साइट चल रहा है"

d = threads.deferToThread(django_useravailable, from_attr, user_available) 
d.addCallback(self.success) 
d.addErrback(self.failure) 
+1

कृपया कोड पोस्ट करें, विशेष रूप से वह हिस्सा जो आपके ऐप को "ब्लॉक" करता है। – ohnoes

उत्तर

1

मुमकिन है अपाचे के तहत mod_wsgi या इसी तरह के प्रयोग से।

आप अपाचे में एम्बेडेड mod_wsgi उपयोग कर रहे हैं तो ध्यान रखें कि अपाचे मल्टी-थ्रेडेड है और अपने अजगर धागे अपाचे के सूत्रण में मैश्ड कर रहे हैं। क्या अवरोधन का विश्लेषण icky हो सकता है।

आप डेमॉन मोड में mod_wsgi (जो आप होना चाहिए) का उपयोग कर रहे हैं, तो आपके Django एक अलग प्रक्रिया है।

इस डिजाइन पैटर्न क्यों जारी रखने के लिए और अपने "अस्पष्ट श्रोता" एक अलग प्रक्रिया नहीं बना।

यदि आप इस प्रक्रिया को कई सर्वरों में से किसी एक को चलाने के लिए चाहते हैं, तो इसे init.rc या cron से शुरू किया जाना चाहिए।

क्योंकि यह एक अलग प्रक्रिया है, यह ध्यान के लिए प्रतिस्पर्धा नहीं करेगी। आपकी Django प्रक्रिया जल्दी से चलती है और आपका जैबर श्रोता स्वतंत्र रूप से चलता है।

+0

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

1

मैं सफल रहे हैं विधि आप अपने वर्तमान पद्धति के रूप में वर्णित का उपयोग कर। आप दस्तावेज़ों को पढ़कर पाएंगे कि घुमावदार डीबी एपीआई हुड के नीचे धागे का उपयोग करता है क्योंकि अधिकांश एसक्यूएल पुस्तकालयों में अवरुद्ध एपीआई होती है।

मैं एक मुड़ सर्वर है कि क्षेत्र में बिजली पर नज़र रखता है से डेटा की बचत होती है, और यह हर अब और फिर एक subthread शुरू और मेरे Django कोड को बचाने को फोन करके यह करता है। आप my live data collection pipeline (यह एक ब्लॉग लिंक है) के बारे में अधिक पढ़ सकते हैं।

क्या आप कह रहे हैं कि आप एक उप थ्रेड शुरू कर रहे हैं और अभी भी अवरुद्ध है?

+0

लेकिन मुड़ने का कारण यह है कि हम _not_ धागे का उपयोग करना चाहते हैं। अगर मुझे मौजूदा थ्रेडेड संस्करण से चिपकना है तो मुझे मुड़ने का उपयोग करने में कोई फायदा नहीं है। मैं फिर भी Django प्रक्रिया से धागे का उपयोग कर सकते हैं। –

+0

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

0

मेरे पास एक चलने वाला ऐप है जहां मैं Django ORM का उपयोग करता हूं। मैं इसका बचाव नहीं कर रहा हूँ। मुझे पता है कि यह गलत है, लेकिन अभी तक कोई समस्या नहीं है।

+0

थोड़ा अप्रासंगिक, है ना? –

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