搜尋

首頁  >  問答  >  主體

javascript - 關於node同步異步

#這是來自深入淺出NodeJS一書的

#為什麼說非同步耗時取決於最慢的檔案
就算是異步,不也是單線程,需要一個任務執行完再執行下一個麼
取決於最慢的檔案不就是說這兩個程式碼是同時執行的?

巴扎黑巴扎黑2762 天前770

全部回覆(5)我來回復

  • 我想大声告诉你

    我想大声告诉你2017-05-31 10:41:42

    同步I/O  是 1->2->3->4  这样的时间,为1+2+3+4的时间
    异步I/O  是 -->  1
                    2
                    3
                    4
                    四个同时开始 时间为4个里面最慢的那个。。

    還有js單線程只是你寫的那些基本的js程式碼為單線程,一但是基本的網路或檔案I/O,的時候會進入事件循環,進行並發操作。 。 。 1234 是同時開始的。誰也不等誰。

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-05-31 10:41:42

    同時進行的,互不干擾。

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-31 10:41:42

    node.js非同步任務底層是多執行緒實現的,對於一個非同步任務,node維護一個執行緒池,一個非同步任務從執行緒池中取出一個執行緒去執行,執行完後,將執行緒放回執行緒池

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-31 10:41:42

    同時進行和同步是兩回事情!同步是指依照事情執行的前後順序!後者必須依賴前者的結果!非同步是同時進行但是事情之間的聯繫對於整個流程來說影響不大!好比同時進行多個ajax 請求你的目的只是為了請求資料後展示資料之間並沒有任何關聯。打個比方吧!就好比修路!肯定是先鋪瀝青再去劃線!不然你邊鋪路邊畫線就把鋪好的路搞砸了!這時必須同步異步就會一團糟!但是劃線和道路清理和道路圍欄的安裝這些事情可以同時進行就是所謂的異步並不會影響結果但是也會出現快慢因為安裝圍欄的複雜度高相比其他操作的慢但是最後還是完成了整個流程!反過來看如果你把後三者都按同步處理等待時間就會更加長因為都要等著前一步處理掉再去處理後一步!但是之前10個人修路由於後期要處理三件事情要想實現異步必須增加到30人就好比我們增加了計算機的開銷一樣(不太專業這裡),但是往往計算資源過剩我們這樣異步就很好利用了運算資源!

    回覆
    0
  • 阿神

    阿神2017-05-31 10:41:42

    一個程式,同一時刻,能利用CPU多核心並行執行多個任務,底層不是多執行緒就是多進程.

    Node的底層是libuv.

    對於網路讀寫(I/O),libuv在Linux上用的是內核提供的epoll機制.Linux內核epoll的底層應該是使用內核執行緒實現的,不過epoll的底層實作不需要libuv關心,libuv只需呼叫.

    對於檔案讀寫(I/O),libuv可能使用Linux AIO,也可能自己用多執行緒實作.因為Linux核心提供的非同步檔案讀寫機制AIO主要還是為資料庫服務的,比如MySQL就依賴libaio.so .目前的Kernel AIO僅支援O_DIRECT方式(DirectIO)來對磁碟讀寫.這意味著,程式無法利用系統的快取Page Cache,同時它要求讀寫的的大小和偏移要以區塊的方式對齊.對於大檔案讀寫可能還好,小檔案不太適合.所以libuv應該是自己在底層用多執行緒來實現非同步檔案讀寫.

    不管是網路讀寫還是文件讀寫,程式總是要返回的,什麼時候返回,肯定是所有任務處理完成後返回,所以耗時一般是讀寫時間最長的那個任務.不過,文件讀寫可能受限於磁碟IOPS,不可避免會產生阻塞,這時整體耗時可能會更長.

    Node用於伺服器程式設計或伺服器中間層程式設計時,主要還是發生網路讀寫.

    回覆
    0
  • 取消回覆