Node 新手,这是我对 Node 执行顺序的理解,希望各位指正

2016-06-28 09:32:31 +08:00
 Mark24

第一个问题:Node的整体执行顺序是什么呢?

是这样么:

  1. 一开始从我们的code入口开始,以同步,顺序执行的方式执行我们的代码。
  2. 如果其中存在 I/O 则被放入 事件队列,I/O交给操作系统,执行完毕后,会把回调放入事件队列,Node继续执行我的主线程代码
  3. 然后我的代码被整个跑过一遍(不会阻塞等待IO),即凡是不涉及I/O的部分,被跑过一遍。
  4. 代码跑完后,余下的就是事件和事件回调的逻辑,于是Node事件循环(Event Loop)不断的检查队列中的事件,如果检测到,则交给主线程运行其回调的逻辑。

总结: 密集的I/O会交给别的线程独立负责,但是如果主线程中出现特别耗时的执行,那么就会耽搁队列中事件的执行(这个模型决定的),但是整体上,CPU利用率增高了,内存的开销减少了(相比传统多线程,还是这个模型决定的),由于减少了线程创立,上下文切换,所有Node的资源占用少,CPU使用率高也就是性能高。所以Node如果用来做以JSON数据交换为主,接受密集网络请求的服务器(比如:社交网站的手机m站)性能会很好。密集计算不适合Node。

其实上面的流程,也就是我对:

“Everything runs in parallel except your code! (在Node中)除了你的代码,一切都是并行的!”

这句话的理解。


我的理解对么? 请各位大神指正

4449 次点击
所在节点    Node.js
14 条回复
Mark24
2016-06-28 09:43:15 +08:00
xuzicn
2016-06-28 10:31:36 +08:00
码一下。围观
jarlyyn
2016-06-28 10:35:38 +08:00
感觉大体没错。

但是
于是 Node 事件循环( Event Loop )

这一段,应该是利用类似 epoll 的技术吧?
xhowhy
2016-06-28 11:38:39 +08:00
暴露给 js 是一个回调函数,往下一层是 event-loop ,再往下是多线程。我的理解,如果有误请指正。
我们不需要关心 I/O 在后台是如何工作的,但是由于我们的计算机硬件的工作方式,线程是处理器最基本的执行单元, libuv 和操作系统通常会运行后台 /工作者线程, 或者采用非阻塞方式来轮流执行任务。
Fontaine
2016-06-28 14:55:10 +08:00
talk is cheap , show me the code
williamx
2016-06-28 14:58:37 +08:00
应该不是只有 io 是异步的
thomasyim
2016-06-28 15:23:53 +08:00
基本是正确的,改正一个地方:

你总结里写的,“多个线程”这个概念是错误的,不管是 Node 还是浏览器的 JS 都是单线程的,这点始终要清楚,至于 Event Loop 这块,你说的基本对但是表达上还是有些模糊,可以看一下 EU JSConf 这个关于 EventLoop 的这块, http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html ,给别人安利过 N 次了……
Mark24
2016-06-28 16:38:52 +08:00
@thomasyim 十分感谢~
Mark24
2016-06-28 17:59:14 +08:00
@thomasyim 看完回来回复,五星好评,运作机理如此清晰!!!感谢
wizardforcel
2016-06-28 18:50:17 +08:00
不对,是首先初始化全局的队列,然后把入口的函数塞进去。之后的逻辑就是队列不为空就取出来执行,执行过程中还有可能往里塞东西(跟 bfs 似的)

你拿 libuv 写写项目就明白了。。

eventloop 会串行按顺序执行队列里的东西,没有线程的上下文切换。。
thomasyim
2016-06-28 21:46:38 +08:00
@Mark24 不客气
eoo
2016-06-29 01:09:36 +08:00
好牛逼的理解,才新手就有这等理解,后生可畏啊!
a275727449
2016-06-29 10:37:31 +08:00
zhuangzhuang1988
2016-06-29 10:44:37 +08:00
大循环 + 优先队列 + poll

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX