? ? ? 如果一個server采用一個進程負(fù)責(zé)一個request的方式,那么進程數(shù)就是并發(fā)數(shù)。那么顯而易見的,就是會有很多進程
在等待中。等什么?最多的應(yīng)該是等待網(wǎng)絡(luò)傳輸。其缺點題主應(yīng)該也感覺到了,此處不述。
? ? ?而nginx 的異步非阻塞工作方式正是利用了這點等待的時間。在需要等待的時候,這些進程就空閑出來待命了。因此表
現(xiàn)為少數(shù)幾個進程就解決了大量的并發(fā)問題。
? ? ? ? nginx是如何利用的呢,簡單來說:同樣的4個進程,如果采用一個進程負(fù)責(zé)一個request的方式,那么,同時進來4個
request之后,每個進程就負(fù)責(zé)其中一個,直至?xí)掙P(guān)閉。期間,如果有第5個request進來了。就無法及時反應(yīng)了,因為4
個進程都沒干完活呢,因此,一般有個調(diào)度進程,每當(dāng)新進來了一個request,就新開個進程來處理。
? ? ? ? nginx不這樣,每進來一個request,會有一個worker進程去處理。但不是全程的處理,處理到什么程度呢?處理到可
能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請求返回。那么,這個處理的worker不會這么傻等
著,他會在發(fā)送完請求后,注冊一個事件:“如果upstream返回了,告訴我一聲,我再接著干”。于是他就休息去了。此
時,如果再有request 進來,他就可以很快再按這種方式處理。而一旦上游服務(wù)器返回了,就會觸發(fā)這個事件,worker才
會來接手,這個request才會接著往下走。