nodejs单线程的原因:
众所周知JS是门非阻塞单线程语言,因为在最初JS就是为了和浏览器交互而诞生的。如果JS是门多线程的语言的话,我们在这个多线程中处理DOM就可能会发生问题(一个线程中新加节点,另一个线程中删除节点),当然可以引入读写解锁这个问题。
执行过程:
在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到Task(有多种task)队列中,一旦执行栈为空,Event Loop就会从Task队列中拿出需要执行的代码并放入执行栈中执行
无异步代码示意图
有异步代码示意图
console.log('Hello')
setTimeout(function() {
console.log('你好')
}, 1000)
console.log('World')
以上代码执行过程为:
-
- 主函数main()进入到执行栈(STACK)中
-
- console.log(“Hello”)先进入到执行栈
-
- 执行打印console.log(‘Hello’)操作并弹出
-
- setTimeout进入到执行栈中,并同时在Web API中开启等待,到等待1000后,进入到CALLBACk QUEUE,等待的同时 console.log(‘World’)进入到执行执行栈
-
- 打印console.log(‘World’),并弹出执行栈
-
- 主函数main()弹出执行栈
-
- 此时执行栈为空,CALLBACk QUEUE中的回调函数进入到执行栈
-
- 打印console.log(‘你好’)并弹出执行栈