国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

一個故事講清楚NIO

LeviDing / 2874人閱讀

摘要:盡管異步能提高系統吞吐量,但其并不能讓一個請求的等待時間下降,相反可能會增加等待時間。

假設某銀行只有10個職員。該銀行的業務流程分為以下4個步驟:
1) 顧客填申請表(5分鐘);
2) 職員審核(1分鐘);
3) 職員叫保安去金庫取錢(3分鐘);
4) 職員打印票據,并將錢和票據返回給顧客(1分鐘)。
  我們看看銀行不同的工作方式對其工作效率到底有何影響。
1 BIO方式
  每來一個顧客,馬上由一位職員來接待處理,并且這個職員需要負責以上4個完整流程。當超過10個顧客時,剩余的顧客需要排隊等候。
  我們算算這個銀行一個小時到底能處理多少顧客?一個職員處理一個顧客需要10分鐘(5+1+3+1)時間,一個小時(60分鐘)能處理6個顧客,一共10個職員,那就是只能處理60個顧客。
  可以看到銀行職員的工作狀態并不飽和,比如在第1步,其實是處于等待中。
  這種工作其實就是BIO,每次來一個請求(顧客),就分配到線程池中由一個線程(職員)處理,如果超出了線程池的最大上限(10個),就扔到隊列等待 。
2 NIO方式
  如何提高銀行的吞吐量呢?
  思路:分而治之,將任務拆分開來,由專門的人負責專門的任務。
  具體來講,銀行專門指派一名職員A,A的工作就是每當有顧客到銀行,他就遞上表格讓顧客填寫,每當有顧客填好表后,A就將其隨機指派給剩余的9名職員完成后續步驟。
  我們計算下這種工作方式下銀行一個小時到底能處理多少顧客?
  假設顧客非常多,職員A的工作處于飽和中,他不斷的將填好表的顧客帶到柜臺處理,柜臺一個職員5分鐘能處理完一個顧客,一個小時9名職員能處理:9*(60/5)=108。
  可見工作方式的轉變能帶來效率的極大提升。

  這種工作方式其實就NIO的思路。下圖是非常經典的NIO說明圖,mainReactor線程負責監聽server socket,accept新連接,并將建立的socket分派給subReactor;subReactor可以是一個線程,也可以是線程池(一般可以設置為CPU核數),負責多路分離已連接的socket,讀寫網絡數據,這里的讀寫網絡數據可類比顧客填表這一耗時動作,對具體的業務處理功能,其扔給worker線程池完成。

  可以看到典型NIO有三類線程,分別是mainReactor線程、subReactor線程、work線程。不同的線程干專業的事情,最終每個線程都沒空著,系統的吞吐量自然就上去了。

3 異步方式
  第二種工作方式有沒有什么可以提高的地方呢?
  仔細查看可發現第3步驟這3分鐘柜臺職員是在等待中度過的,那怎么能讓柜臺職員保持滿負荷呢?
  還是分而治之的思路,指派1個職員B來專門負責第3步驟。每當柜臺員工完成第2步時,就通知職員B來負責與保安溝通取錢。這時候柜臺員工可以繼續處理下一個顧客。當職員B拿到錢之后,他會怎么辦呢?他會通知顧客錢已經到柜臺了,讓顧客重新排隊處理,當柜臺職員再次服務該顧客時,發現該顧客前3步已經完成,直接執行第4步即可。
  我們可以算算通過這種方法,銀行的吞吐量能提高到多少。
  假設職員B的工作非常飽和,柜臺一個職員現在2分鐘能處理完一個顧客,一個小時8名職員能處理:8*(60/2)=240。
  在當今web服務中,經常需要通過RPC或者Http等方式調用第三方服務,這里對應的就是第3步,如果這步耗時較長,通過異步方式將能極大降低資源使用率。
  jetty Continuations 就實現了上述異步方式(http://wiki.eclipse.org/Jetty...)。
  NIO+異步的方式能讓少量的線程(資源)做大量的事情,這適用于很多應用場景,比如代理服務、api服務、長連接服務等等,這些應用如果用同步方式將耗費大量機器資源。盡管NIO+異步能提高系統吞吐量,但其并不能讓一個請求的等待時間下降,相反可能會增加等待時間。
4 小結
  總結就一句:“分而治之,將任務拆分開來,由專門的人負責專門的任務”,這不僅在計算機領域生效,在整個社會領域都生效。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71734.html

相關文章

  • 講清之javascript作用域

    摘要:并且作用域鏈也確定了在當前上下文中查找標識符后返回的值。為了具象化分析問題,我們可以假設作用域鏈是一個數組,數組成員有一系列變量對象組成。注意,所有作用域鏈的最末端都為全局變量對象。所以作用域作用域鏈都是在當前運行環境內代碼執行前就確定了。 什么是作用域(Scope)? 作用域產生于程序源代碼中定義變量的區域,在程序編碼階段就確定了。javascript 中分為全局作用域(Global...

    whidy 評論0 收藏0
  • 如何準備校招技術面試

    摘要:網易跨境電商考拉海購在線筆試現場技術面面。如何看待校招面試招聘,對公司而言,是尋找勞動力對員工而言,是尋找未來的同事。 如何準備校招技術面試 標簽 : 面試 [TOC] 2017 年互聯網校招已近尾聲,作為一個非 CS 專業的應屆生,零 ACM 經驗、零期刊論文發表,我通過自己的努力和準備,從找實習到校招一路運氣不錯,面試全部通過,謹以此文記錄我的校招感悟。 寫在前面 寫作動機 ...

    MkkHou 評論0 收藏0
  • Conflux吐槽君:IOTA物聯網電磁爐-讓PoW的耗電沒有遺憾

    摘要:任何人或物聯網設備想發起交易,只需要引用其他兩個交易就可以了。只要好人的交易總數足夠多,它就是安全的。要知道,應用場景是物聯網設備,物聯網設備跑真是天才的想法啊。不僅如此,這個電磁爐還能提高烹飪的安全系數。 鑒于有不少小伙伴反映,覺得區塊鏈技術圈亂象橫生,魚龍混雜,導致大家很難去辨識哪些是真正的技術。甚至有些人,打著說技術的名號,其實自己本身都沒弄懂弄明白,只是懂個皮毛,就開始拿著各種...

    seasonley 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<