異步編程的優勢和難點
阿新 • • 發佈:2018-02-02
過多 異常 all pla 自定義 循環 pro param ++
傳統解決方式:
- 多線程: 多線程上下文切換問題,鎖問題,同步問題
- c/c++手動完成:門檻較高
node基於事件的非阻塞編程
優勢:
-
非阻塞I/O可以使CPU與I/O並不依賴,可以更大程度的利用資源
-
對於網絡應用,並行帶來的優勢更大,利於分布式和雲的應用
-
由於調用了c/c++的擴展模塊,node的性能較高
難點:
-
異常處理
-
不能使用try/catch/final對異步編程進行異常處理,因為發生異常的代碼不一定在本次事件循環中執行,所以有可能捕捉不到
解決方法:給callback第一個參數傳遞是否報錯,未報錯則返回null報錯則返回error對象。
原則:在編寫自定義異步方法時,必須執行調用者傳入的參數,必須正確返回參數callback(null, results)
-
對用戶調用的回調函數進行try/catch
try { req.body = JSON.parse(buf, options.reviver); callback(); } catch (err){ err.body = buf; err.status = 400; callback(err); }
這樣就會導致callback中出錯也會被catch到,導致調用兩次callback
解決方法:
try { req.body = JSON.parse(buf, options.reviver); } catch (err){ err.body = buf; err.status = 400; callback(err); } callback();
-
-
阻塞代碼:不要用while來阻塞,用setTimeout
-
多線程:用child_process
- 回調過多 解決方案異步編程的優勢和難點-多異步之間的協作方案
異步編程的優勢和難點