第一次写博客,还是处于新手的状态,如写得有问题,请斧正!!
node语言的见解
1.js异步单线程在Node中的实现:利用系统线程池
Node采用Chrome V8引擎处理JavaScript脚本,V8最大的特点就是单线程运行,一次只能运行一个任务,代码从上到下按顺序执行
Node大量采用异步操作,即任务不是马上执行,而是插在任务队列的尾部,等到前面的任务运行完后再执行
传统的开发方式大部分都是IO阻塞的,例如读文件,都是读取完毕才能进行下一步操作,所以需要多线程来更好的利用硬件资源,所以有时候会给人带来一种错觉:线程越多越好
异步IO也叫非阻塞IO,就是Node的callback,不会影响下一步操作,等到文件读取完毕,回调函数自动被执行。而不是在等待。
2.IO优势
- 对于文件读写,Node采用的是非阻塞IO
- 传统IO在读写文件的时候CPU来处理,而代码执行也处于等待中,浪费性能
- 非阻塞IO将读写操作交给CPU,而代码正常执行,减少等待浪费的性能
3.应用的场景
- 实际应用: webpack/gulp/npm/http-server/json-server
- 服务器中负责IO读写的中间层服务器(天猫中间层IO服务器)
4.异步编程带来的难题:
-
异常处理:异步I/O包含两个阶段,提交请求和处理结果,这两个阶段中有事件循环的调度,两者彼此不关联。异步方法通常在第一个阶段提交请求后立即返回,因为异常并不一定发生在这个阶段,try/catch在此处不会发挥任何作用
-
函数嵌套过深 {{{{{{{{{{
-
多线程只是异步的一种实现手段而已,并不代表,实现异步都需要多线程。多线程编程时需要面临
开发人员要面临跨线程通信编程
child_process
cluster
5.node.js中的异步IO操作和异步非IO操作 API
- 异步IO API
操作文件 网络请求
- 异步非IO
API (原理同异步IO稍有不同,并没有开启新线程,js中是先把主任务(代码任务)执行完毕,然后再去执行下面两个方法中的代码)
setTimeout setInterval
6.JS的单线程异步的实现
js是单线程,这里的单线程仅仅只能说明JavaScript执行在单线程中,js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node的Chrome V8)是多线程的,宿主环境通过某种方式(事件驱动模型[1])使得js具备了异步的属性。js的单线程异步,其实本质上还是多线程来实现的。
参考链接: link.