2012-12-02 46 views
0

對不起這個愚蠢的問題,但我真的很困惑;我希望你能糾正我錯在哪裏。'一個'IOLoop如何處理10k連接?

基於線程服務器(如Apache),我明白,每個客戶端,一個新的'工人'將被創建爲他服務他的所有需求。

事件驅動(如Nginx的和龍捲風)

,這來自我的困惑,espetially那裏是一個不是線程安全Python的GIL;據我所知,有一個單一的循環將處理所有的客戶請求,所以我愚蠢的理解,如果有10000個simultanous連接,我沒有看到如何服務所有這10個thousend請求!

回答

2

在事件驅動的服務器中,您只需使用非阻塞呼叫來處理連接(來自特定連接的read() s和write())。您通常會使用一些呼叫在連接之間進行多路複用(select(),poll(),...),以告訴您需要維修哪些連接,然後依次爲它們提供服務。

+0

那麼爲什麼我們不能在事件驅動和基於線程的服務器之間進行組合? –

+1

你可以。例如:您可能每個CPU核心都有一個線程,其中每個線程都是事件驅動的。您可能還有工作線程來處理動態頁面生成(PHP,JSP,...),並通過「正常」事件驅動線程提供靜態內容(圖像......)。 – ninjalj

+0

問題是,Python(CPytohn)擁有GIL,並且如上所述,Tornado處理10k連接,所以我感到震驚!如果10k同時連接發生,那麼,如果一個操作有1秒,il將被分裂爲1/10k? –