2013-08-29 62 views
0

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

如果我要实现这个线程池,我会使用一个队列来保存我的线程,并会同步所有get(线程)操作。但显然这是不合理的。

那么Web服务器是做什么的?

回答

0

这取决于网络服务器。

例如,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) 

所有线程开始启动的应用程序。这是关于它的。

相关问题