我们有一个供内部使用的简单网络服务器,只有一个职责:监听请求,读取请求,并将数据推送到数据库中。 db和webserver都位于同一台机器上。 db是一个mysql-db,服务器是一个运行单线程的python webserver(BaseHTTPServer.HTTPServer
)。
问题是无法同时处理两个请求。问题是,是否有助于使网络服务器多线程(使用django,cheryypy,..)?直观地说,Web服务器只执行CPU消耗任务,因此将其更改为多线程应该没有帮助。这是对的吗?
答案 0 :(得分:2)
当您想要一次处理多个请求时,拥有多个线程或进程确实可以帮助您(实际上它需要实际操作)。
这并不意味着两个请求将被更快处理。拥有一个进程或线程池对于Web服务器性能非常有用,但在这种情况下这并不是很明显(除非你有多个内核)。但MySQL同时处理两个请求没有问题,所以如果你的网络服务器也可以这样做,那么你就可以摆脱只处理一个请求的问题。
但是,如果开始使用这样的服务器是值得的,那么你可以回答。 :) Django肯定是矫枉过正的,看看一些小的WSGI服务器。
答案 1 :(得分:1)
步骤1.使用Apache。它可能看起来有点矫枉过正,但它是便宜的多线程,您无需编程。 Apache可以配置为分叉多个服务器。你没有编程。
这可能足以使您的应用程序同时运行。
步骤2.重写您的应用程序以使用wsgi框架并将其嵌入wsgiref
服务器。这不会有太大变化,但这是始终编写小型Web应用程序的方式。
步骤3.在Apache中使用mod_wsgi。它允许您拥有应用程序的一个或多个后台守护程序版本。没有额外的编程,您可以获得一堆并发性。
重要的经验教训。 始终使用WSGI。
答案 2 :(得分:0)
如果Web服务器是单线程的,并且数据库请求是同步的(意味着在处理数据库请求时Web服务器被阻止),那么使其成为多线程会有所帮助。
这使您可以同时处理多个请求。您的数据库引擎可能非常擅长。但是,现在你并没有让它同时为多个请求提供服务,因为你的Web服务器就在它前面,一次只能为它提供一个请求。
答案 3 :(得分:0)
我的直觉说你是对的,但它也说使用Django或Cherrypy是过度杀戮,即使你确实想让它成为多线程。
我认为你是对的,因为如果网络服务器除了工作数据库之外真的没有做任何事情,那么除了启动响应之外,任何其他线程都无法做任何事情。客户端将很乐意等待其他请求完成所需的10到100毫秒,然后服务器将能够立即accept()
。
答案 4 :(得分:0)
您应该使用多线程或异步网络服务器,否则会阻止每个请求。 Django是一个Web框架,您可能必须查找可以在当前设置中透明替换的脚本,并且仍然拥有纯python多线程Web服务器。否则扭曲也是一个很好的解决方案。 AFA我可以看到,您可能不需要Web框架,因为您没有使用模板驱动的MVC样式应用程序。