2010-04-11 19 views
12

पर धीमी पायथन HTTP सर्वर एक बहुत ही सरल पायथन HTTP सर्वर बनाते समय मुझे कुछ प्रदर्शन समस्याओं का सामना करना पड़ रहा है। मुख्य मुद्दा यह है कि प्रदर्शन इस बात पर निर्भर करता है कि मैं किस क्लाइंट का उपयोग करने के लिए उपयोग करता हूं, जहां सर्वर और सभी क्लाइंट स्थानीय मशीन पर चल रहे हैं। उदाहरण के लिए, एक पायथन स्क्रिप्ट (urllib2.urlopen ('http://localhost/') से जारी एक GET अनुरोध .read()) को पूरा करने के लिए केवल एक सेकंड से अधिक समय लगता है, जो धीमा लगता है कि सर्वर लोड नहीं है। MSXML2.ServerXMLHTTP का उपयोग कर Excel से GET अनुरोध चलाना भी धीमा लगता है। हालांकि, Google क्रोम या आरसीआरएल से डेटा का अनुरोध करते हुए, आर के लिए कर्ल ऐड-इन, अनिवार्य रूप से तत्काल प्रतिक्रिया उत्पन्न करता है, जो मैं अपेक्षा करता हूं।स्थानीयहोस्ट

मेरे भ्रम में आगे बढ़ना यह है कि जब मैं अपने कंप्यूटर पर काम पर हूं (प्रदर्शन समस्याएं मेरे घर कंप्यूटर पर हैं) तो मुझे किसी भी क्लाइंट के लिए किसी भी प्रदर्शन की समस्या का अनुभव नहीं होता है। दोनों सिस्टम पायथन 2.6 चलाते हैं, हालांकि कार्य कंप्यूटर 7 के बजाय विंडोज एक्सपी चलाता है।

नीचे मेरा बहुत ही सरल सर्वर उदाहरण है, जो किसी भी अनुरोध के लिए 'हैलो वर्ल्ड' देता है।

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class MyHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     print("Just received a GET request") 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 

     self.wfile.write('Hello world') 

     return 

    def log_request(self, code=None, size=None): 
     print('Request') 

    def log_message(self, format, *args): 
     print('Message') 

if __name__ == "__main__": 
    try: 
     server = HTTPServer(('localhost', 80), MyHandler) 
     print('Started http server') 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print('^C received, shutting down server') 
     server.socket.close() 

ध्यान दें कि MyHandler में मैं log_request() और log_message() फ़ंक्शन ओवरराइड। कारण यह है कि मैंने पढ़ा है कि इन कार्यों में से किसी एक द्वारा निष्पादित एक पूर्ण-योग्य डोमेन नाम लुकअप धीमा सर्वर का कारण हो सकता है। दुर्भाग्यवश उन्हें एक स्थिर संदेश मुद्रित करने के लिए सेट करने से मेरी समस्या हल नहीं हुई।

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

उत्तर

11

यह कोड के साथ समस्या की तरह नहीं लगता है।

GET /index.html HTTP/1.1 
host: www.blah.com 
<enter> <enter> 

और सर्वर की प्रतिक्रिया पर ध्यान दें: एक HTTP सर्वर समस्या निवारण का एक गंधा रास्ता पोर्ट 80 पर यह करने के लिए कनेक्ट करने के लिए यह करने के लिए से टेलनेट तो फिर तुम जैसे कुछ टाइप कर सकते हैं। देखें कि क्या आपको इस दृष्टिकोण का उपयोग करने में देरी हो रही है।

आप यह भी देखने के लिए किसी भी फ़ायरवॉल को बंद करना चाहते हैं कि वे मंदी के लिए जिम्मेदार हैं या नहीं।

लोकहोस्ट के लिए 127.0.0.1 को बदलने का प्रयास करें। यदि यह समस्या हल करता है, तो यह एक सुराग है कि एफक्यूडीएन लुकअप वास्तव में संभव कारण हो सकता है।

+0

जॉन प्रदर्शन नहीं करता साथ मेरे अनुरोध हैंडलर में BaseHTTPRequestHandler.address_string() ओवरराइड करने के लिए है पर एक नज़र डालें - टिप के लिए धन्यवाद, अनुरोध 127.0.0.1 पर जाने के लिए गति मुद्दे हल किया। अगर कोई मुझे एफक्यूडीएन लुकअप को नियंत्रित करने के बारे में अधिक जानकारी दे सकता है जो उपयोगी होगा। – Abiel

+0

ठीक है ... इसका मतलब यह हो सकता है कि urllib2.urlopen() और Excel "localhost" पर FQDN लुकअप का एक तरीका कर रहे हैं जो किसी भी तरह हल करने के लिए हमेशा के लिए ले रहा है। पूछने का सवाल यह है कि क्रोम और कर्ल लुकअप को अलग तरीके से क्यों कर रहे हैं?आप अन्य पायथन कार्यों को आजमा सकते हैं जो http: // (सॉकेट कॉल, शायद?) तक पहुंच सकते हैं और देख सकते हैं कि यह एक पायथन दुभाषिया विशिष्ट चीज़ या urllib विशिष्ट है या नहीं। यदि दुभाषिया विशिष्ट है, तो ओएस/फ़ायरवॉल किसी भी तरह से क्रोम और कर्ल से अलग python.exe और एक्सेल जैसे प्रक्रियाओं का इलाज कर सकता है। – user235859

26

अनुरोध हैंडलर लॉग में क्लाइंट नाम प्रदर्शित करने के लिए एक व्यस्त नाम लुकअप जारी करता है। मेरा विंडोज 7 पहला DNS लुकअप जारी करता है जो बिना किसी देरी के विफल रहता है, उसके बाद 2 क्लाइंट नेटबीओएसओएस नाम HTTP क्लाइंट को पूछताछ करता है, और प्रत्येक एक 2 सेक टाइमआउट = 4 सेकेंड देरी में चला जाता है !!

http://www.answermysearches.com/xmlrpc-server-slow-in-python-how-to-fix/2140/

एक और ठीक है कि काम मेरे लिए एक संस्करण है कि नाम देखने

def address_string(self): 
    host, port = self.client_address[:2] 
    #return socket.getfqdn(host) 
    return host 

फिलिप

+3

धन्यवाद। यह मेरे जीवन को बचाया। –

+1

धन्यवाद .. मेरा जीवन भी बचाओ !! – Manish

+1

और मेरा! बहुत धन्यवाद! – buskila

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