javascript - 關(guān)于node同步異步
問題描述
這是來自深入淺出NodeJS一書的
為什么說異步耗時取決于最慢的文件就算是異步,不也是單線程,需要一個任務(wù)執(zhí)行完再執(zhí)行下一個么取決于最慢的文件不就是說這兩個代碼是同時執(zhí)行的?
問題解答
回答1:同步I/O 是 1->2->3->4 這樣的時間,為1+2+3+4的時間
異步I/O 是 --> 1234四個同時開始 時間為4個里面最慢的那個。。
還有js單線程只是你寫的那些基本的js代碼為單線程,一但是基本的網(wǎng)絡(luò)或者文件I/O,的時候會進入事件循環(huán),進行并發(fā)操作。。。1234 是同時開始的。誰也不等誰。
回答2:同時進行的,互不干擾。
回答3:node.js異步任務(wù)底層是多線程實現(xiàn)的,對于一個異步任務(wù),node維護一個線程池,一個異步任務(wù)從線程池中取出一個線程去執(zhí)行,執(zhí)行完后,將線程放回線程池
回答4:同時進行和同步是兩回事情!同步是指按事情執(zhí)行的前后順序!后者必須依賴前者的結(jié)果!異步是同時進行但是事情之間的聯(lián)系對于整個流程來說影響不大!好比同時進行多個ajax 請求你的目的只是為了請求數(shù)據(jù)后展示數(shù)據(jù)之間并沒有任何關(guān)聯(lián)。打個比方吧!就好比修路!肯定是先鋪瀝青再去劃線!不然你邊鋪路邊畫線就把鋪好的路給搞砸了!這時必須同步異步就會一團糟!但是劃線和道路清理和道路圍欄的安裝這些事情可以同時進行就是所謂的異步并不會影響結(jié)果但是也會出現(xiàn)快慢因為安裝圍欄的復(fù)雜度高相比其他操作的慢但是最后還是完成了整個流程!反過來看如果你把后三者都按同步處理等待時間就會更加長因為都要等著前一步處理掉再去處理后一步!但是之前10個人修路由于后期要處理三件事情要想實現(xiàn)異步必須增加到30人就好比我們增加了計算機的開銷一樣(不太專業(yè)這里),但是往往計算資源過剩我們這樣異步就很好利用了計算資源!
回答5:一個程序,同一時刻,能利用CPU多核并行執(zhí)行多個任務(wù),底層不是多線程就是多進程.
Node的底層是libuv.
對于網(wǎng)絡(luò)讀寫(I/O),libuv在Linux上用的是內(nèi)核提供的epoll機制.Linux內(nèi)核epoll的底層應(yīng)該是使用內(nèi)核線程實現(xiàn)的,不過epoll的底層實現(xiàn)不需要libuv關(guān)心,libuv只需調(diào)用.
對于文件讀寫(I/O),libuv可能使用Linux AIO,也可能自己用多線程實現(xiàn).因為Linux內(nèi)核提供的異步文件讀寫機制AIO主要還是為數(shù)據(jù)庫服務(wù)的,比如MySQL就依賴libaio.so.目前的Kernel AIO僅支持O_DIRECT方式(DirectIO)來對磁盤讀寫.這意味著,程序無法利用系統(tǒng)的緩存Page Cache,同時它要求讀寫的的大小和偏移要以區(qū)塊的方式對齊.對于大文件讀寫可能還好,小文件不太適合.所以libuv應(yīng)該是自己在底層用多線程來實現(xiàn)異步文件讀寫.
不管是網(wǎng)絡(luò)讀寫還是文件讀寫,程序總是要返回的,什么時候返回,肯定是所有任務(wù)處理完成后返回,所以耗時一般是讀寫時間最長的那個任務(wù).不過,文件讀寫可能受限于磁盤IOPS,不可避免會產(chǎn)生阻塞,這時整體耗時可能會更長.
Node用于服務(wù)器編程或者服務(wù)器中間層編程時,主要還是發(fā)生網(wǎng)絡(luò)讀寫.
相關(guān)文章:
1. docker鏡像push報錯2. dockerfile - [docker build image失敗- npm install]3. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問題4. 在windows下安裝docker Toolbox 啟動Docker Quickstart Terminal 失敗!5. docker-machine添加一個已有的docker主機問題6. angular.js - angular內(nèi)容過長展開收起效果7. 關(guān)于docker下的nginx壓力測試8. python小白基礎(chǔ)問題 關(guān)于while循環(huán)9. python小白問題 關(guān)于局部變量和全局變量10. python - pyqt多線程問題實在不是很明白。。求解。。
