node 学习
发布时间:2020-12-15 00:29:02 所属栏目:C语言 来源:网络整理
导读:table class="text" tr class="li1" td class="ln"pre class="de1"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 2018-10-25?### 关于 node 的比喻?1. 进程和线程? ? 进程:打开一个应用 exe ,?
<table class="text"> |
<tr class="li1">
<td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2018-10-25
?
### 关于 node 的比喻
?
1. 进程和线程
? ? 进程:打开一个应用 exe ,
? ? 线程:应用链接一个用户,使用者。线程之间数据可以共享
?
2. 并发和并行
? ? 并发:解决多个任务的能力,任务之间的切换。比喻:吃饭的时候,有人打电话,然后你接电话(不吃饭),打完电话,又开始吃,结果又来了电话……
? ? 并行:同时执行的能力,多个任务一起执行。比喻:吃饭的时候,有人打电话,你可以一边接电话,一边吃饭
? ? *并发并行区别在于是否同时执行*
3. 单线程多线程
- 其他语言可能是一个大气的老板,客人多,就雇佣多个服务员;
- Node.js 是一个抠门的老板。值雇佣一个员工,但是这个名员工不是普通员工,是机器,的王者级的员工
?
### node 特点
?
1. 单线程
- 在Java,PHP或者NET等服务器端语言中,会为每一个客户端连接单独创建一个线程。而每个线程单独需要消耗大约2MB的内存。也就是说理论上说,一个内存为8GB的Web服务器,可以连接大概4000个客户。要让Web服务器可以多连接客户访问,就必须增加服务器的数量。而Web服务器的应用成本就大大增加了。
- Node.js不为每个客户连接创建一个新的线程。而仅仅使用一个线程,当有用户连接了,就会触发一个内部事件,通过非阻塞I/O,事件驱动机制,让Node.js程序宏观上也是并行的,使用Node.js,一个8GB的内存条,理论上就可以支持40000个用户连接了。另外单线程的好处就是,还有操作系统不在由创建,销毁销毁线程的时间。
?
2. 非阻塞
- 例如,当在访问数据库数据的时候,需要一段时间进行I/O操作,在传统的单线程处理机制中,在执行了访问数据库代码之后,这个线程都将先停下来,等待数据库返回数据结果,才能执行后面的代码,也就是说I/O阻塞了线程的执行,极大的降低了程序的执行效率。
- 在传统阻塞模式下,一个线程只能处理一项任务,要想处理连接的吞吐量必须通过多线程。而在Node.js这种非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU利用率永远是100%,所以这是一种也别有哲理的设计方案,人多,但是好多人都闲着,还不如人少,往死里干活。
- 由于Node.js执行了非阻塞I/O机制,因此在执行了访问数据库代码之后,将立即执行后面的代码,把数据库执行返回结果的处理放到了代码的执行回调函数中,从而以提高了函数的执行效率。
?
3. 事件驱动
- 在Node中,客户端请求建立连接,提交数据等行为,会触发相应的事件,在Node中,在一个时刻,只能执行一个回调函数,但是在执行一个回调函数的中途,可以转而处理其他事件(比如:又有新用户连接了),然后继续返回执行原事件的回调函数,这种处理机制,成为“事件环”机制。
- 在Node.js底层是C++,底层代码中,近半数都适用于事件队列,回调函数队列的构建。用事件驱动来完成任务调度。
?
4. 总结
- 单线程:单线程的好处是,减少了内存开销,操作系统的内存换页。如果是多线程的,那么某一个事情进入了I/O,但是被阻塞了,这个线程就被阻塞了。
- 非阻塞I/O: 不会傻等I/O语句结束,而会执行后面的语句。非阻塞就可以解决问题吗?比如线程正在执行者小红的请求连接,而小明的I/O操作回调完成了,此事怎么办呢?
- 事件机制,事件环:不管是新用户的请求,还是老用户的I/O完成,Node.js都会以事件机制加入事件环,等待调度。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!