python BaseHTTPRequestHandler + cgi.FieldStorage 处理简单post 请求离奇的慢

2011-12-21 13:40:27 +08:00
 ri0day
大家好,我是python 新手,主要为了练习一下python 网络编程。所以自己试着封装了一个memcache的http接口,就用了2个模块 httpserver 和cgi 代码如下:

https://gist.github.com/1500628

这个基本是依葫芦画瓢来的。但是我发现 我每次请求一次这个接口,无论是add,delete 还是get 都差不多需要2秒的时间。每次的时间固定在2.007s 2.006s 左右

[root@esf ~]# time curl -F "authkey=aaa" -F "action=get" -F "cachekey=wumin" http://10.10.93.16:801
bs2
real 0m2.007s
user 0m0.001s
sys 0m0.003s

我想知道为什么会出现这种情况。如果我直接用pylibmc操作memcache 是很快的。包了一层http接口会慢一点点。但是也不至于这么慢啊。网上说cgi.FieldStorage处理上传文件很慢。但我这个根本不上传文件。只是从post的数据中拿几个参数出来 对memcache做操作而已.

我网上搜索了一些profile 工具(hotshot),我对程序也进行了一次profile。但是发现耗时的地方竟然是 基础库socketserver里的readline。到这里我就不知道如何做了。请大家指点一下。

ncalls tottime percall cumtime percall filename:lineno(function)
21 1.997 0.095 1.997 0.095 /usr/local/lib/python2.6/socket.py:373(readline)

以下是我的profile的完整输出:
http://dpaste.com/675668/

我尝试过网上说的一些可能解决办法。比如重写BaseHTTPServer 里反向解析客户端IP的那段代码:
host, port = self.client_address[:2]
# return socket.getfqdn(host)
return host

还是没有效果。请指教一下。这问题到底出在哪里。
8558 次点击
所在节点    Python
1 条回复
ri0day
2011-12-21 15:00:12 +08:00
已经解决了。不是代码问题。是curl POST的问题。我用代码写post请求返回很快。至于具体是curl什么问题 我去研究一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/23969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX