Web服务器如何管理其线程池以服务并发请求

时间:2013-08-29 14:36:30

标签: webserver threadpool

维护工作线程池的Web服务器如何确保当两个请求同时进入时,同一个线程不专用于这两个请求?它是如何实现的:“每个请求都有自己的线程?”

如果我要实现这个线程池,我会使用一个队列来保存我的线程并同步所有“get thread”操作。但显然这是低效的。

那么网络服务器做了什么?

1 个答案:

答案 0 :(得分:1)

这取决于网络服务器。

例如,Nginx不使用多个线程:

  

Nginx是为解决C10K而编写的少数服务器之一   问题。与传统服务器不同,Nginx不依赖于线程   处理请求。相反,它使用更加可扩展的事件驱动   (异步)架构。这种架构使用的很小,但更多   重要的是,负载下可预测的内存量。即使你   不要指望处理成千上万的同时请求   仍然受益于Nginx的高性能和小内存   脚印。 Nginx向各个方向扩展:从最小的VPS全部扩展   通往服务器集群的方式。

http://wiki.nginx.org/Main

另一方面,Apache可以执行多线程/多进程,具体取决于配置。


如果我要为Web服务器实现线程池,我可能会将请求放在阻塞队列上。

池中的所有线程都会在队列中等待。一旦请求进入,第一个可用的线程将获得请求并回答它。如果另一个请求进入,当第一个线程正在应答时,由于阻塞队列,它将自动分配给另一个线程。一旦线程完成应答,它就可以再次在队列上等待并准备好再次回答。在伪代码中,这需要:

处理请求的Web服务器代码

function onRequestReceived(request)
  requestQueue.put(request)

  //Note: request would be a custom object, containing info about the request, like the tcp connection the headers and possibly additional info

然后,工作线程看起来像:

function run()
    while true:
        request = requestQueue.get()
        handleRequest(request)

所有线程都在应用程序启动时启动。这是关于它的。