維護一個工作線程池的Web服務器如何確保當兩個請求同時進入時,同一個線程不會專用於這兩個請求?即它是如何實現的:「每個請求都有自己的線程?」Web服務器如何管理其線程池以服務併發請求
如果我要實現這個線程池,我會使用一個隊列來保存我的線程,並會同步所有get(線程)操作。但顯然這是不合理的。
那麼Web服務器是做什麼的?
維護一個工作線程池的Web服務器如何確保當兩個請求同時進入時,同一個線程不會專用於這兩個請求?即它是如何實現的:「每個請求都有自己的線程?」Web服務器如何管理其線程池以服務併發請求
如果我要實現這個線程池,我會使用一個隊列來保存我的線程,並會同步所有get(線程)操作。但顯然這是不合理的。
那麼Web服務器是做什麼的?
這取決於網絡服務器。
例如,Nginx的不使用多線程:
Nginx的是書面解決C10K 問題服務器的少數之一。與傳統的服務器不同,Nginx不依賴線程來處理請求 。相反,它使用了更具可擴展性的事件驅動的 (異步)架構。這種架構使用較小但更重要的是,在負載下可預測的內存量。即使您不希望處理數千個同時發生的請求,您仍然可以從Nginx的高性能和小內存 佔用空間中受益。 Nginx可以在所有方向上進行擴展:從最小的VPS到所有服務器集羣。
的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)
所有線程開始啓動的應用程序。這是關於它的。