2010-04-11 34 views
12

Çok basit bir Python HTTP sunucusu oluştururken bazı performans sorunları yaşıyorum. En önemli sorun, sunucunun ve tüm istemcilerin yerel makinede çalıştırıldığı istemciye erişmek için kullandığım müşteriye göre performansın değişmesidir. Örneğin, bir Python komut dosyasından (urllib2.urlopen ('http://localhost/') .read()) verilen bir GET isteğinin tamamlanması, sunucunun yükleme yapılmadığı düşünüldüğünde yavaş görünen, tamamlanması bir saniyeden uzun sürüyor. GET isteğini MSXML2.ServerXMLHTTP kullanarak Excel'den çalıştırmak da yavaş hissediyor. Bununla birlikte, Google Chrome veya RCurl'dan veri istemek, R için curl eklentisi, beklediğim şey olan esasen anlık bir yanıt verir.localhost'ta Yavaş Python HTTP sunucusu

Benim karışıklığa daha fazla eklemek, bilgisayar başında çalışırken bilgisayarımda herhangi bir performans sorunu yaşamadığım (performans sorunları ana bilgisayarımda). Her iki sistem de çalışma bilgisayarı 7 yerine Windows XP çalıştırmasına rağmen Python 2.6'yı çalıştırır.

Aşağıda, herhangi bir get isteği için 'Merhaba dünya'yı döndüren çok basit bir sunucu örneğim var. MyHandler I log_request() ve log_message() işlevlerini geçersiz olduğunu

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() 

Not. Bunun nedeni, bu işlevlerden biri tarafından gerçekleştirilen tam etki alanı adı aramasının yavaş sunucu için bir neden olabileceğini okumam. Ne yazık ki onları sadece statik bir mesaj yazdırmak için ayarlamam sorunumu çözmedi.

Ayrıca, myHandler uygulamasında do_GET() rutininin ilk satırı olarak print() ifadesini eklediğime dikkat edin. Yavaşlık, bu mesajın basılmasından önce gerçekleşir, yani sonradan gelen hiçbir şey gecikmeye neden olmaz.

cevap

11

Bu, kodla ilgili bir sorun gibi görünmüyor.

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

sunucunun yanıtını gözlemlemek: bir HTTP sunucusu giderme bir şık yolu Sonra şöyle yazabilirsiniz 80 numaralı bağlantı noktasında kendisine telnet kendisine bağlayacak. Bu yaklaşımı kullanarak gecikme olup olmadığını görün.

Ayrıca, yavaşlamadan sorumlu olup olmadıklarını görmek için güvenlik duvarlarını da kapatmak isteyebilirsiniz.

localhost için 127.0.0.1 değiştirmeyi deneyin. Eğer bu problemi çözerse, o zaman FQDN arayışının muhtemel neden olabileceğine dair bir ipucu budur.

+0

john yapmayan bir sürümü ile benim istek işleyicisi içinde BaseHTTPRequestHandler.address_string() geçersiz kılmaktır için çalıştığı bir başka düzeltme göz at Bahşiş için teşekkürler, istek 127.0.0.1 gitmek için hız sorunu çözüldü. FQDN arayışını kontrol etmekle ilgili yararlı olabilecek daha fazla bilgi verebilecek biri varsa. – Abiel

+0

Tamam ... Bu, urllib2.urlopen() ve Excel'in bir şekilde çözmek için sonsuza dek süren "localhost" üzerinde FQDN aramasının bir yolunu yaptığı anlamına gelebilir. Sorulması gereken soru, Chrome'un neden/neden olduğu ve aramanın farklı şekilde nasıl yapılacağıdır?Http: // (soket çağrıları, belki?) 'E erişen diğer Python işlevlerini deneyebilir ve bunun bir Python yorumlayıcısına özgü bir şey mi yoksa özel bir urllib olup olmadığını öğrenebilirsiniz. Tercümana özelse, OS/güvenlik duvarı bir şekilde python.exe ve Excel gibi işlemleri Chrome'dan farklı bir şekilde işleme ve curl olabilir. – user235859

26

İstemci ismini günlüğe kaydetmek için istek işleyicisi ters isim araması yapar. Windows 7'de hiçbir gecikme olmadan başarısız olan bir ilk DNS araması, ardından HTTP istemcisine 2 ardışık NetBIOS ad sorgusu ve her biri 2 saniyelik bir zaman aşımı = 4 saniye gecikmesiyle karşılaşıyor! -

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

beni adı araması

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

Philippe

+3

Teşekkürler. Bu hayatımı kurtardı. –

+1

teşekkürler .. hayatımı kurtar! – Manish

+1

ve benim! çok teşekkürler! – buskila

İlgili konular