2013-02-26 44 views
5

Django (Webfaction द्वारा आयोजित) का उपयोग करते हुएDjango, नींद() सभी प्रक्रियाओं को रोक देता है, लेकिन केवल अगर कोई GET पैरामीटर नहीं है?

import time 
def my_function(request): 
    time.sleep(10) 
    return HttpResponse("Done") 

यह Django के माध्यम से क्रियान्वित किया जाता है जब मैं अपने यूआरएल पर जाते हैं, www.mysite.com

मैं दो बार URL दर्ज करें, तुरंत, मैं कोड निम्नलिखित है एक दूसरे के बाद। जिस तरह से मैं इसे देखता हूं, इन दोनों को 10 सेकंड के बाद खत्म होना चाहिए। हालांकि, दूसरा कॉल पहले के लिए इंतजार कर रहा है और 20 सेकंड के बाद खत्म हो जाता है।

यदि, हालांकि, मैं कुछ डमी जीईटी पैरामीटर दर्ज करता हूं, www.mysite.com?dummy=1 और www.mysite.com?dummy=2 तो वे दोनों 10 सेकंड के बाद खत्म होते हैं। तो दोनों एक साथ चलाने के लिए यह संभव है।

ऐसा लगता है कि नींद का दायरा किसी भी तरह वैश्विक है ?? हो सकता है कि एक पैरामीटर दर्ज करने से उन्हें अलग-अलग प्रक्रियाओं के बजाए चलाया जा सके ???

यह वेबफैक्शन द्वारा होस्ट किया गया है। httpd.conf है:

KeepAlive Off 
Listen 30961 
MaxSpareThreads 3 
MinSpareThreads 1 
ServerLimit 1 
SetEnvIf X-Forwarded-SSL on HTTPS=1 
ThreadsPerChild 5 

मैं() नींद और विश्वास है कि यह सब कुछ रोक नहीं है का उपयोग करने में सक्षम होना चाहिए। तो, क्या हो रहा है और इसे कैसे ठीक किया जाए?

संपादित करें: वेबफैक्शन अपाचे का उपयोग करके इसे चलाता है।

+0

'नींद 'का उपयोग करने के लिए उपयोग-केस क्या है? ऐसा लगता है कि आप कुछ अजीब कर रहे हैं यदि आप इसे अनुरोध/प्रतिक्रिया चक्र में उपयोग करना चाहते हैं। हो सकता है कि आप समझा सकें कि आप क्या करने की कोशिश कर रहे हैं, और हम विकल्पों का सुझाव दे सकते हैं। –

उत्तर

8

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

यहाँ मैं क्या सोचता स्थिति आप में हो रहा है:।

संसाधन एक के लिए
  • पहले GET अनुरोध में आता है अपाचे एक चल कार्यकर्ता (एक नया एक या शुरू होता है)
  • कार्यकर्ता 10 सेकंड सोता का उपयोग करता है
  • इसके दौरान, संसाधन ए के लिए एक नया अनुरोध आता है। अपाचे देखता है कि यह एक ही संसाधन का अनुरोध कर रहा है और इसे अनुरोध के लिए उसी कार्यकर्ता को भेजता है। मुझे लगता है कि यहां धारणा यह है कि एक कार्यकर्ता जिसने हाल ही में अनुरोध को संसाधित किया है एक विशिष्ट संसाधन यह अधिक संभावना है कि कार्यकर्ता के पास कुछ जानकारी कैश/प्रीप्रोसेस्ड/जो भी हो, वह हो ndle इस अनुरोध पर तेज़ी से
  • यह केवल कार्यकर्ता इंतजार कर रहा है कि 2 बार 10 सेकंड

यह व्यवहार करता है पूरी तरह से समय के 99% समझ तो यह तार्किक डिफ़ॉल्ट पर यह करने के लिए है पर एक 20 दूसरे खंड में जो परिणाम के बाद से वहाँ है ।

हालांकि, यदि आप दूसरे अनुरोध (जीईटी पैरामीटर जोड़कर) के लिए अनुरोधित संसाधन बदलते हैं तो अपाचे मान लेगा कि यह एक अलग संसाधन है और एक और कार्यकर्ता शुरू करेगा (क्योंकि पहला वाला पहले से ही "व्यस्त" है (अपाचे नहीं कर सकता जानते हैं कि आप कोई कड़ी मेहनत नहीं कर रहे हैं)। चूंकि अब दो कर्मचारी हैं, दोनों 10 सेकंड इंतजार कर रहे हैं, कुल समय 10 सेकंड तक चला जाता है।


इसके अतिरिक्त मुझे लगता है कि आपके डिजाइन के साथ गलत है। लगभग कोई भी मामला नहीं है जिसके बारे में मैं सोच सकता हूं कि HTTP अनुरोध के जितना तेज़ हो सके उतना तेज़ प्रतिक्रिया नहीं देनी चाहिए। आखिरकार, आप कम से कम समय में जितना संभव हो उतना अनुरोध करना चाहते हैं, इसलिए 10 सेकंड सोना सबसे प्रतिकूल काम है जो आप कर सकते हैं। मैं आपको एक नया प्रश्न बनाने की सलाह दूंगा और बताऊंगा कि आप वास्तविक लक्ष्य क्या है कि आप हासिल करने की कोशिश कर रहे हैं। मुझे यकीन है कि इसके लिए एक और समझदार समाधान है!

+0

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

+0

Django एकल थ्रेडेड है, इसलिए यह हमेशा एक समस्या होगी। यदि आपको एसिंक्रोनस, गैर-अवरुद्ध सामग्री की आवश्यकता है, तो आप शायद टोरनाडो जैसे कुछ देखना चाहेंगे। –

3

मान लें कि आप अपने Django-server को केवल run() के साथ चलाते हैं, डिफ़ॉल्ट रूप से यह एक थ्रेडेड सर्वर बनाता है। यदि आप एक थ्रेडेड प्रक्रिया पर नींद का उपयोग करते हैं, तो पूरे आवेदन उस नींद के समय के लिए जमा हो जाता है।

+0

तो मैं सिर्फ नींद का उपयोग नहीं कर सकता() क्योंकि यह हर कॉल को प्रभावित करेगा ?? क्या यह सिर्फ एक Django मुद्दा है? मुझे हर कॉल को रोक दिए बिना मेरे फ़ंक्शंस को रोकने का कोई तरीका चाहिए। – user984003

+0

बीटीडब्ल्यू, सुनिश्चित नहीं है कि Django का उपयोग स्वचालित रूप से है कि मैं Django सर्वर चला रहा हूँ। वेबफैक्शन अपाचे का उपयोग करता है। – user984003

+0

अच्छा बिंदु, अभी भी प्रभाव वही लगता है। केवल एक धागा दोनों अनुरोधों को संभालता है, अगर उनमें से दोनों – Gjordis

1

यह हो सकता है कि आपका ब्राउज़र पहले अनुरोध के बाद ही किए जाने वाले दूसरे अनुरोध को कतारबद्ध कर रहा हो। यदि आप एक ही ब्राउज़र में अपने यूआरएल खोल रहे हैं, तो दो अलग-अलग (जैसे फ़ायरफ़ॉक्स और क्रोम) का उपयोग करने का प्रयास करें, या wget या curl का उपयोग करके कमांड लाइन से अनुरोध करने का प्रयास करें।

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

  • कोई संबंधित समस्या नहीं^_^