hi 这里是胡斌的上周工作总结
Node中线程和异步的理解
一些理解
我们写出来的js代码,是在单线程的环境中执行,但nodejs本身不是单线程的。如果我们在代码中执行了一个promise,它们可能是通过底层的c++模块在另外的线程中完成?... 但对于我们自己的js代码来说,它们处于单线程中。因为异步函数执行完将结果通过回调函数传给我们的时候,我们的代码一次只能处理一个。
node擅长处理高并发,是因为拥有异步IO,node在处理IO时主线程会创建N个子线程以提高速度,虽然开启了多个线程,但是所有线程都是基于主线程开启的只能跑在一个进程当中并不能充分利用cpu资源
单线程的问题
var start = Date.now();//获取当前时间戳
setTimeout(function () {
console.log(Date.now() - start);
for (var i = 0; i < 10000000000; i++){//执行长循环
}
}, 1000);
setTimeout(function () {
console.log(Date.now() - start);
}, 2000);
上面执行后的输出结果为1000、13322,足足等了10秒钟,console.log才被执行,这个for循环是一个非常吃CPU的计算过程,而Node的主线程却只能调用一个CPU来计算它(线程是cpu调度的一个基本单位,一个cpu同时只能执行一个线程的任务),但是如果我们在写JS代码时能像Node底层开启另外一个线程处理异步的方式那样,手动创建子线程,这个问题就解决了。
cluster和多线程模型
- cluster是Node内置的用于启动多个子进程的模块,可以用来让Node.js充分利用多核cpu的性能。
- 而另外一个TAGG模块可以让Node支持多线程模型从而启动多个子线程。
关于这两个模块对于进程和线程的操作原理以及区别还没有学习到位,下次总结这个吧。
使用单线程的Node写代码时应该注意的东西
- 上面的测试说明了,在主线程做一些CPU计算量很大的任务可能会导致主线程卡住或者长时间停顿从而让整个程序的执行延时甚至卡死,影响程序性能,所以我们要非常小心的处理大量的循环,字符串拼接和浮点运算这种cpu密集型任务,在需要的时候应该利用上面提到的cluster和多线程模型把任务丢给子线程或子进程去完成,保持程序主线程的畅通。
然而我现在还没有真正使用过多线程模型进行编程过,上面的都是总结的理论知识,下次使用过后再好好总结这方面的知识。