Total Pageviews

Monday 16 July 2012

使用Python编写HTTP程序

Python语言简单高效,有很多非常容易使用的类库,可以大大提高开发效率,而且Python相对于PHP来说,具有良好的线程支持,也是其重要优势之 一。在系统开发层面,使用Python语言编写HTTP服务程序,是一项比较有意义的技术,HTTP接口妇孺皆知,学习成本很低,各种语言都有HTTP客 户端。

使用Python语言编写HTTP服务程序主要有以下几种方式:
1,传统的CGI方式。
几乎所有的WEB服务器都支持这种方式,但由于每次请求都需要生成新的Python解释器进程,并且Python解释器需要加载很多Python语言编写的类库,所以效率非常低,几乎没有实用价值。
2,FASTCGI方式。
与PHP的FASTCGI方式类似,但确实没有PHP方便,效率有相当的提升,但WEB服务器与Python解释器之间存在进程间通信,效率仍然不是最好。
3,mod_python方式。
此种方式是将Python解释器嵌入到Apache HTTP服务器的httpd进程中,这样WEB服务器与Python不存在任何进程间通信,大大提高了效率,并且每个httpd进程只需要生成一次,就可以服务很多此请求。
4,WSGI方式。
这种方式貌似只是一种接口定义而已,Apache HTTPD有专门的mod_wsgi模块,可以实现嵌入式,或者类似FASTCGI的daemon方式,使用稍复杂,没仔细研究,不介绍。

我非常推荐mod_python方式,成熟稳定,效率非常不错,开发也简单。

以下以CentOS 5.5为例,介绍如何安装配置mod_python并编写示例程序。

1,安装apache以及mod_python

这个不是重点,为了简单,使用了yum安装CentOS5.5发行版自带的版本:

#yum install httpd
#yum install mod_python

然后就安装成功了。

2,配置mod_python

我们使用最高效的handler模式进行配置:
#cat /etc/httpd/conf.d/python.conf |grep -v "^#"|uniq

LoadModule python_module modules/mod_python.so

<Directory /var/www/html/py>
    PythonAutoReload On
    AddHandler mod_python .py
    PythonHandler x
</Directory>

3,编写handler程序:

#cat /var/www/html/py/x.py
from mod_python import apache
def handler(req):
        name="mengguang"
        s="Good evening, %s" % (name)
        req.content_type="text/plain"
        req.write(s)
        return apache.OK

4,测试:

#curl  http://localhost:800/py/x.py

5,性能测试:

ab -n 10000 -c 10 http://localhost:800/py/x.py

我在一台单CPU的VMware虚拟机上大概每秒处理3000次请求。

6,参考资料:

http://www.modpython.org/

官方站点有一句话比较有意思:

Currently mod_python is not under active development. This does not mean that it is "dead" as some people have claimed. It smiply means that the code and the project are mature enough when very little is required to maintain it.