传统解决方式:
- 多线程: 多线程上下文切换问题,锁问题,同步问题
- 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
- 回调过多 解决方案异步编程的优势和难点-多异步之间的协作方案