第一个问题:Node的整体执行顺序是什么呢?
是这样么:
总结: 密集的I/O会交给别的线程独立负责,但是如果主线程中出现特别耗时的执行,那么就会耽搁队列中事件的执行(这个模型决定的),但是整体上,CPU利用率增高了,内存的开销减少了(相比传统多线程,还是这个模型决定的),由于减少了线程创立,上下文切换,所有Node的资源占用少,CPU使用率高也就是性能高。所以Node如果用来做以JSON数据交换为主,接受密集网络请求的服务器(比如:社交网站的手机m站)性能会很好。密集计算不适合Node。
其实上面的流程,也就是我对:
“Everything runs in parallel except your code! (在Node中)除了你的代码,一切都是并行的!”
这句话的理解。
我的理解对么? 请各位大神指正
1
Mark24 OP |
2
xuzicn 2016-06-28 10:31:36 +08:00
码一下。围观
|
3
jarlyyn 2016-06-28 10:35:38 +08:00
感觉大体没错。
但是 于是 Node 事件循环( Event Loop ) 这一段,应该是利用类似 epoll 的技术吧? |
4
xhowhy 2016-06-28 11:38:39 +08:00 1
暴露给 js 是一个回调函数,往下一层是 event-loop ,再往下是多线程。我的理解,如果有误请指正。
我们不需要关心 I/O 在后台是如何工作的,但是由于我们的计算机硬件的工作方式,线程是处理器最基本的执行单元, libuv 和操作系统通常会运行后台 /工作者线程, 或者采用非阻塞方式来轮流执行任务。 |
5
Fontaine 2016-06-28 14:55:10 +08:00
talk is cheap , show me the code
|
6
williamx 2016-06-28 14:58:37 +08:00 1
应该不是只有 io 是异步的
|
7
thomasyim 2016-06-28 15:23:53 +08:00 1
基本是正确的,改正一个地方:
你总结里写的,“多个线程”这个概念是错误的,不管是 Node 还是浏览器的 JS 都是单线程的,这点始终要清楚,至于 Event Loop 这块,你说的基本对但是表达上还是有些模糊,可以看一下 EU JSConf 这个关于 EventLoop 的这块, http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html ,给别人安利过 N 次了…… |
10
wizardforcel 2016-06-28 18:50:17 +08:00 via Android 2
不对,是首先初始化全局的队列,然后把入口的函数塞进去。之后的逻辑就是队列不为空就取出来执行,执行过程中还有可能往里塞东西(跟 bfs 似的)
你拿 libuv 写写项目就明白了。。 eventloop 会串行按顺序执行队列里的东西,没有线程的上下文切换。。 |
12
eoo 2016-06-29 01:09:36 +08:00 via Android 1
好牛逼的理解,才新手就有这等理解,后生可畏啊!
|
13
a275727449 2016-06-29 10:37:31 +08:00 1
|
14
zhuangzhuang1988 2016-06-29 10:44:37 +08:00 1
大循环 + 优先队列 + poll
|