У меня возникают проблемы с производительностью при создании очень простого Python HTTP-сервера. Ключевая проблема заключается в том, что производительность зависит от того, какой клиент я использую для доступа к нему, где сервер и все клиенты работают на локальном компьютере. Например, запрос GET, выданный из скрипта Python (urllib2.urlopen ('http://localhost/').read()), занимает чуть более секунды, что кажется медленным, учитывая, что сервер не загружен. Выполнение запроса GET из Excel с использованием MSXML2.ServerXMLHTTP также чувствует себя медленно, однако при запросе данных у Google Chrome или из RCurl, надстройки curl для R, получается практически мгновенный ответ, чего я и ожидал.
Еще одно недоразумение вызывает то, что у меня нет проблем с производительностью ни у одного клиента, когда я на работе на компьютере (проблемы с производительностью на моем домашнем компьютере). Обе системы работают на Python 2.6, хотя рабочий компьютер работает под управлением Windows XP вместо 7.
Ниже приведен мой очень простой пример сервера, который просто возвращает «Hello world» для любого запроса get.
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 (). Причина в том, что я прочитал, что поиск полного доменного имени, выполняемый одной из этих функций, может быть причиной медленного сервера. К сожалению, установка их для печати только статического сообщения не решила мою проблему.
Также обратите внимание, что я добавил оператор print () в качестве первой строки подпрограммы do_GET () в MyHandler. Замедление происходит до того, как это сообщение будет напечатано, и это означает, что ни одна из вещей, которая появляется после, не вызывает задержки.