我在创建一个非常简单的Python HTTP服务器时遇到了一些性能问题。关键问题是,性能取决于我用哪个客户端来访问它,其中服务器和所有客户端都在本地机器上运行。例如,从一个Python脚本发出的GET请求(urllib2.urlopen(' http://localhost/ ').read())需要一秒多的时间来完成,考虑到服务器没有负载,这似乎很慢。使用MSXML2.ServerXMLHTTP从Excel运行GET请求也感觉很慢。然而,从谷歌浏览器或RCurl(R的curl插件)中请求数据,基本上可以得到即时的响应,这是我所期望的。
让我更加困惑的是,当我在工作的电脑上时,我没有遇到任何客户端的性能问题(性能问题是在我家里的电脑上)。两个系统都运行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__":
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()例程的第一行加入了print()语句。缓慢发生在这个信息被打印之前,这意味着在它之后的东西都没有造成延迟。