У меня возникают некоторые проблемы с производительностью при создании очень простого HTTP-сервера Python. Основная проблема заключается в том, что производительность зависит от того, какой клиент я использую для доступа к ней, где сервер и все клиенты запускаются на локальном компьютере. Например, запрос GET, выданный с Python script (urllib2.urlopen('http://localhost/').read()) принимает только за секунду до завершения, что кажется медленным, учитывая, что сервер не загружается. Выполнение запроса GET из Excel с использованием MSXML2.ServerXMLHTTP также мешает. Однако, запрашивая данные Google Chrome или RCURL, надстройка curl для R дает практически мгновенный отклик, чего я ожидаю.
Добавление к моей путанице заключается в том, что я не испытываю проблем с производительностью для любого клиента, когда я нахожусь на своем компьютере на работе (проблемы с производительностью на моем домашнем компьютере). Обе системы используют Python 2.6, хотя рабочий компьютер работает под управлением Windows XP вместо 7.
Ниже приведен мой очень простой пример сервера, который просто возвращает "Hello world" для любого запроса на получение.
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. Медленность происходит до того, как это сообщение будет напечатано, что означает, что ни одна из вещей, которые появляются после него, вызывает задержку.