We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
从官网中,我们可以看到对Node最精简、准确的描述: 看完官网对Node的描述后,让我们带着以下几个问题往下看这篇文章:
从上文中,我们可以获取以下几个关键点:
从上述信息中,我们多次提到同步和异步、阻塞和非阻塞,那到底什么是同步和异步、阻塞和非阻塞呢?
举例:
在获取接口调回的结果前线程被阻塞,只能等。
假设每次调用接口,都会立刻把值返回,但返回的值不一定是调用者所希望,此时,调用者在每次接口调用之间可以进行别的事情,线程并没有被阻塞。
在调用的接口返回数据前,什么都不做,直到调用的接口有数据返回才继续往下执行。
不管接口有没有数据返回,线程都正常工作,继续往下执行代码。
同步IO的特点:
异步IO的特点:
“执行IO操作”是否阻塞
当请求被阻塞,就是同步IO,否则就是异步IO
发起IO操作是否阻塞?
如果阻塞知道完成,就是阻塞IO,否则就是非阻塞IO
让我们来讨论几个比较有代表性的IO模型,以加深我们对同步IO和异步IO、阻塞IO和非阻塞IO的了解。
讲完什么是同步和异步、阻塞和非阻塞,什么是同步IO和异步IO、阻塞IO和非阻塞IO,下面我们再来讲讲“因为JavaScript是单线程执行,根本不能进行同步操作,所以,JavaScript的这一‘缺陷‘导致了它只能使用异步IO”这句话是什么意思。
因为JavaScript是单线程执行,根本不能进行同步操作,所以,JavaScript的这一“缺陷”导致了它只能使用异步IO
这句话的意思是这样理解的:
我们常说“JavaScript是单线程的”。所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。不妨叫它主线程。JS引擎中负责解释和执行JavaScript代码的线程只有一个,说明代码只能按照执行顺序一行一行执行,遇到耗时代码就会阻塞住(不能像其他语言一样开一个线程来执行耗时操作) 然而浏览器是事件驱动的,很多操作是异步的,浏览器有多个线程来做此工作。例如:处理AJAX请求的线程、处理DOM事件的线程、定时器线程、读写文件的线程(例如在Node.js中)等等。这些线程可能存在于JS引擎之内,也可能存在于JS引擎之外,在此我们不做区分。不妨叫它们工作线程。js 中的异步代码如 AJAX 完成请求、 setTimeout() 定时器到时间后,浏览器会把这些需要执行的异步操作放到自己的消息队列中,并轮循这个队列,在浏览器空闲时处理事件。
那什么是事件驱动呢?它是怎么实现异步的呢?
Node官网中对Node有过这样一句描述:“Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效”。我们来看一下Node的工作原理。
异步非io setTimeout() setInterval() 判断是否可执行,如果可以执行就把callback扔回到队列,不可以执行就跳过(不从队列中删除)。 异步io 文件操作 会从线程池当中去取一条线程,帮助主线程去执行,当子线程执行完毕后,会将callback扔回到队列。
Node工作流程如下图所示:
Node为什么要基于Chrome V8引擎呢? 所以Node.js是一个基于Chrome V8引擎的JavaScript的运行环境。
所以,我们可以通过Node做什么呢?
传统服务存在如下问题: 传统服务器处理请求的流程如下图所示:
Node解决如下问题: Node.js的应用是通过javascript开发的,然后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。 Node处理请求的流程如下图所示:
当然对于这些缺点也有很多解决办法: 开启多个进程,每个进程绑定不同的端口,用反向代理服务器如 Nginx 做负载均衡,好处是我们可以借助强大的 Nginx 做一些过滤检查之类的操作,同时能够实现比较好的均衡策略,但坏处也是显而易见——我们引入了一个间接层。 多进程绑定在同一个端口侦听。在Node.js中,提供了进程间发送“文件句柄” 的功能。 一个进程负责监听、接收连接,然后把接收到的连接平均发送到子进程中去处理。
参考资料如下: https://www.cnblogs.com/euphie/p/6376508.html https://segmentfault.com/a/1190000004322358 https://www.zhihu.com/question/19732473 https://segmentfault.com/a/1190000014840597 https://zhuanlan.zhihu.com/p/36344554 https://blog.csdn.net/u013217071/article/details/78043081 https://zhuanlan.zhihu.com/p/30743785 https://juejin.im/post/59e85eebf265da430d571f89?tdsourcetag=s_pcqq_aiomsg
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Node是什么?
从官网中,我们可以看到对Node最精简、准确的描述:
看完官网对Node的描述后,让我们带着以下几个问题往下看这篇文章:
Node的来源
从上文中,我们可以获取以下几个关键点:
从上述信息中,我们多次提到同步和异步、阻塞和非阻塞,那到底什么是同步和异步、阻塞和非阻塞呢?
同步和异步,阻塞和非阻塞
同步和异步
同步
举例:
异步
举例:
console.log(data);
});
阻塞和非阻塞
阻塞
举例:
非阻塞
举例:
通过前端代码对同步和异步、阻塞和非阻塞的举例说明
同步阻塞
在获取接口调回的结果前线程被阻塞,只能等。
同步非阻塞
假设每次调用接口,都会立刻把值返回,但返回的值不一定是调用者所希望,此时,调用者在每次接口调用之间可以进行别的事情,线程并没有被阻塞。
异步阻塞
在调用的接口返回数据前,什么都不做,直到调用的接口有数据返回才继续往下执行。
异步非阻塞
不管接口有没有数据返回,线程都正常工作,继续往下执行代码。
同步IO和异步IO
什么是IO?
同步IO
同步IO的特点:
异步IO
异步IO的特点:
如何区分是同步IO还是异步IO呢?
“执行IO操作”是否阻塞
阻塞IO和非阻塞IO
如何区分是阻塞IO还是非阻塞IO呢?
发起IO操作是否阻塞?
讨论几个IO模型
让我们来讨论几个比较有代表性的IO模型,以加深我们对同步IO和异步IO、阻塞IO和非阻塞IO的了解。
阻塞式I/O模型
非阻塞式I/O模型
I/O复用模型
信号驱动式I/O模型
异步I/O模型
讲完什么是同步和异步、阻塞和非阻塞,什么是同步IO和异步IO、阻塞IO和非阻塞IO,下面我们再来讲讲“因为JavaScript是单线程执行,根本不能进行同步操作,所以,JavaScript的这一‘缺陷‘导致了它只能使用异步IO”这句话是什么意思。
JavaScript的特性
这句话的意思是这样理解的:
我们常说“JavaScript是单线程的”。所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。不妨叫它主线程。JS引擎中负责解释和执行JavaScript代码的线程只有一个,说明代码只能按照执行顺序一行一行执行,遇到耗时代码就会阻塞住(不能像其他语言一样开一个线程来执行耗时操作)
然而浏览器是事件驱动的,很多操作是异步的,浏览器有多个线程来做此工作。例如:处理AJAX请求的线程、处理DOM事件的线程、定时器线程、读写文件的线程(例如在Node.js中)等等。这些线程可能存在于JS引擎之内,也可能存在于JS引擎之外,在此我们不做区分。不妨叫它们工作线程。js 中的异步代码如 AJAX 完成请求、 setTimeout() 定时器到时间后,浏览器会把这些需要执行的异步操作放到自己的消息队列中,并轮循这个队列,在浏览器空闲时处理事件。
那什么是事件驱动呢?它是怎么实现异步的呢?
事件驱动
Node官网中对Node有过这样一句描述:“Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效”。我们来看一下Node的工作原理。
node工作原理
主线程
子线程
Node工作流程如下图所示:
Node是基于Chrome V8引擎的
Node为什么要基于Chrome V8引擎呢?
所以Node.js是一个基于Chrome V8引擎的JavaScript的运行环境。
所以,我们可以通过Node做什么呢?
Node能做什么?
Node解决了什么问题?
传统服务存在如下问题:
传统服务器处理请求的流程如下图所示:
Node解决如下问题:
Node.js的应用是通过javascript开发的,然后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。
Node处理请求的流程如下图所示:
使用Node的优劣势
优势
劣势
当然对于这些缺点也有很多解决办法:
开启多个进程,每个进程绑定不同的端口,用反向代理服务器如 Nginx 做负载均衡,好处是我们可以借助强大的 Nginx 做一些过滤检查之类的操作,同时能够实现比较好的均衡策略,但坏处也是显而易见——我们引入了一个间接层。
多进程绑定在同一个端口侦听。在Node.js中,提供了进程间发送“文件句柄” 的功能。
一个进程负责监听、接收连接,然后把接收到的连接平均发送到子进程中去处理。
Node的使用场景
附录
参考资料如下:
https://www.cnblogs.com/euphie/p/6376508.html
https://segmentfault.com/a/1190000004322358
https://www.zhihu.com/question/19732473
https://segmentfault.com/a/1190000014840597
https://zhuanlan.zhihu.com/p/36344554
https://blog.csdn.net/u013217071/article/details/78043081
https://zhuanlan.zhihu.com/p/30743785
https://juejin.im/post/59e85eebf265da430d571f89?tdsourcetag=s_pcqq_aiomsg
The text was updated successfully, but these errors were encountered: