1. 程式人生 > >異步編程的優勢和難點

異步編程的優勢和難點

過多 異常 all pla 自定義 循環 pro param ++

傳統解決方式:

  • 多線程: 多線程上下文切換問題,鎖問題,同步問題
  • c/c++手動完成:門檻較高

node基於事件的非阻塞編程

優勢:

  • 非阻塞I/O可以使CPU與I/O並不依賴,可以更大程度的利用資源

  • 對於網絡應用,並行帶來的優勢更大,利於分布式和雲的應用

  • 由於調用了c/c++的擴展模塊,node的性能較高

難點:

  1. 異常處理

    1. 不能使用try/catch/final對異步編程進行異常處理,因為發生異常的代碼不一定在本次事件循環中執行,所以有可能捕捉不到

      解決方法:給callback第一個參數傳遞是否報錯,未報錯則返回null報錯則返回error對象。

      原則:在編寫自定義異步方法時,必須執行調用者傳入的參數,必須正確返回參數callback(null, results)

    2. 對用戶調用的回調函數進行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();
  2. 阻塞代碼:不要用while來阻塞,用setTimeout

  3. 多線程:用child_process

  4. 回調過多 解決方案異步編程的優勢和難點-多異步之間的協作方案

異步編程的優勢和難點