Re: [問題] Node.js在處理非同步機制的架構問題

看板Ajax作者 (釣到一隻猴子@_@)時間11年前 (2014/04/26 23:01), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《yragggc (逼繩)》之銘言: : 想請問Node.js在處理非同步機制的架構問題 : 於Node.js的APP, 可以使用 : process.nextTick() : child_process.fork() : Cluster : 這幾個方式來處理CPU-bound的task : 但我的理解, 應該是由libuv去處理所有關於分配thread的問題 : 也就是抽象化後, 讓使用者只需要專注於single-thread程式的開發 : 而不是開發者手動去fork process? 這邊不大能說有問題 不過有一點要搞清楚 async主體仍然是single thread 也就是同時間只能跑一段code 而對大多數的狀況來說這個"一段" 通常就是一個function/method (因為一個function處理完至少代表告一段落) 你今天資料收到後需要做一個cpu-bound的task的時候 正常人大概會全部寫在同一個function裡面 但如果在async的狀況下會變成這整個task結束前 (因為上面說的,reactor一次CPU time就配給一整個function) 整個main thread(也就是整隻程式)會被這個task block住 所以你必須要讓reactor知道其實這個運算途中可以讓別人插進來 而上方列的從上而下分別 reactor處理,仍然單thread單core,自己把整個運算拆成好幾個function來算 process處理,可以多core (JS因為沒thread的概念,所以就跳這麼多了XD) 同樣process處理,不過是比較高階的wrapper,很多東西都幫你處理好了 後兩者就是丟給OS來處理cpu time的分配了 也就是說thread(?)(其實async中沒在用thread的XD)的分配這部分 針對I/O-bound的處理上可以自動妥善分配CPU使用 (務實上大多網頁/應用程式也是I/O為主) 但遇到CPU-bound的部分 因為它仍然是single-thread 所以你必須要讓reactor知道何時可以中斷,讓其他task進來 (太麻煩,所以通常會用thread解決,不過JS沒thread只能fork process) : http://ppt.cc/5I5f : 圖為簡易Node.js architecture -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.216.102 ※ 文章網址: http://www.ptt.cc/bbs/Ajax/M.1398524491.A.EC2.html

04/27 14:43, , 1F
04/27 14:43, 1F

05/15 01:20, , 2F
推推
05/15 01:20, 2F
文章代碼(AID): #1JMyfBx2 (Ajax)
文章代碼(AID): #1JMyfBx2 (Ajax)