<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          nodejs異步IO

          共 1826字,需瀏覽 4分鐘

           ·

          2022-04-27 23:38

          作者:小江不可求

          來源:SegmentFault  思否社區(qū) 


          1.IO了解



          IO分類(是否立即獲取到調(diào)用之后的結(jié)果):


          阻塞IO:

          重復(fù)調(diào)用IO操作,判斷IO是否結(jié)束(任務(wù)輪詢:read、select、poll、kqueue、event ports)因?yàn)樵谳喸兊倪^程中,程序再等待IO的結(jié)果,對(duì)于代碼而言,還是同步的效果。


          非阻塞IO:

          實(shí)現(xiàn)無需判斷的非阻塞IO,通過某種信號(hào)或者回調(diào)的形式傳回給當(dāng)前的代碼進(jìn)行使用

          文件IO:

          放入到node實(shí)現(xiàn)的線程池中

          異步網(wǎng)絡(luò)IO:

          利用到了node的核心庫libuv庫

          可判斷所運(yùn)行的平臺(tái)

          根據(jù)平臺(tái)調(diào)用不同的異步IO處理的方法
          (做到了類似于跨平臺(tái)的效果)


          實(shí)現(xiàn)異步IO的過程:


          2.為什么要使用異步I/O



          在不同模式下執(zhí)行兩任務(wù),顯然,異步使用的時(shí)間,比同步使用的時(shí)間少


          3.事件驅(qū)動(dòng)架構(gòu)



          事件輪詢是異步IO的實(shí)現(xiàn),對(duì)異步IO結(jié)果的處理(利用事件驅(qū)動(dòng)、發(fā)布訂閱、觀察則模式),依賴于nodejs的events庫;

          代碼層面展示:

          const EventEmitter = require('events');
          const emitter = new EventEmitter();

          // 訂閱1
          emitter.on('event',(result)=>{
              console.log('event1 fired');
              console.log(result);
          })

          // 訂閱2
          emitter.on('event',(result)=>{
              console.log('event2 fired');
          })

          // 發(fā)布
          emitter.emit('event','event_result');

          /*結(jié)果
          event1 fired
          event_result
          event2 fired
          */

          理解到平時(shí)編碼中,所寫的異步代碼(訂閱啊事件),回調(diào)函數(shù)就是事件的處理程序,不過發(fā)布事件是由系統(tǒng)完成的

          4.nodejs單線程



          怎么實(shí)現(xiàn)并發(fā):異步非阻塞IO配合事件事件回調(diào)通知

          運(yùn)行js代碼的主線程是單線程(減少了多線程切換的cpu開銷與內(nèi)存開銷),但是在libuv庫中,使用到了node實(shí)現(xiàn)的線程池

          缺點(diǎn):處理cpu密集型的任務(wù)時(shí),無法體現(xiàn)多核cpu的優(yōu)勢(shì)

          代碼展示單線程處理cpu密集型任務(wù)時(shí)出現(xiàn)的阻塞現(xiàn)象:

          const http = require('http');

          function sleepTime(time){
              const sleep = Date.now() + time * 1000;
              // 同步代碼,等待時(shí)間
              while(Date.now() < sleep){};
              return;
          }

          sleepTime(4);
          const server = http.createServer((req,res)=>{
              res.end('server starting ...');
          });

          server.listen('8080',()=>{
              console.log('服務(wù)啟動(dòng)了');
          })

          5.nodejs應(yīng)用場(chǎng)景



          適合IO密集型任務(wù)處理,nodejs作為中間層,搭建bff層服務(wù)器(提高吞吐量,方便處理數(shù)據(jù)):




          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色一a电影 | 亚洲AV无码乱码国产精品蜜芽 | 日本被H网站入口 | 久草影音先锋 | 五月婷网|