多线程网页服务器与单线程对比
我们有一个简单的内部使用的网页服务器,它的工作很简单:接收请求、读取请求内容,然后把数据存入数据库。这个数据库和网页服务器都在同一台机器上。数据库是mysql,而服务器是用python写的网页服务器(BaseHTTPServer.HTTPServer
),它是单线程运行的。
现在的问题是,两个请求不能同时处理。有人在问,把网页服务器改成多线程(比如用django、cherrypy等)会不会有帮助?直觉上来说,网页服务器只是在执行一些消耗CPU的任务,所以把它改成多线程应该不会有帮助。这种想法对吗?
5 个回答
如果你的网络服务器是单线程的,也就是说它一次只能处理一个请求,而数据库的请求是同步的(这意味着在处理数据库请求的时候,网络服务器会被阻塞,无法处理其他请求),那么把它改成多线程的会有帮助。
这样的话,你就可以同时处理多个请求了。你的数据库引擎可能在这方面表现得很好。不过现在你并没有让它同时处理多个请求,因为你的网络服务器在前面,只能一次给它一个请求。
第一步:使用Apache。虽然听起来有点复杂,但其实这是个便宜的多线程解决方案,你不需要自己编程。你可以把Apache设置成启动多个服务器,这样就能让你的应用同时运行。
这可能就足够让你的应用实现并发运行了。
第二步:把你的应用重写成使用wsgi框架,并把它嵌入到wsgiref
服务器里。这样做不会改变太多,但这是你应该始终用来编写小型网页应用的方法。
第三步:在Apache中使用mod_wsgi。这样你可以让你的应用有一个或多个后台运行的版本。你不需要额外编程,就能获得大量的并发能力。
重要的经验教训:一定要使用WSGI。
如果你有多个线程或者进程,这确实会对你有帮助(实际上在处理多个请求时是必须的)。
不过,这并不意味着两个请求会处理得更快。拥有一组进程或线程对网页服务器的性能很有帮助,但在这种情况下并不明显(除非你的电脑有多个核心)。不过,MySQL可以同时处理两个请求,所以如果你的网页服务器也能做到这一点,那就解决了只能处理一个请求的问题。
至于是否值得花精力去使用这样的服务器,只有你自己能回答。:) 不过,Django在任何情况下都可能有点过于复杂,可以考虑一些小型的WSGI服务器。