非阻塞模型的缺点是什么?
What is the disadvantage of non-blocking model?
我刚开始学习node.JS。而且我发现有两种模型:阻塞和非阻塞。
我知道非阻塞可以同时执行 I/O 个请求,而阻塞模型必须等待 I/O 响应,然后再执行另一个 I/O 请求。
但是,如果我们同时做两个I/O请求,可能还是会有I/O中断。所以我在这里有点困惑。
所以我的问题是:
看起来非阻塞模型肯定比阻塞模型好,那为什么我们需要阻塞模型?
为什么非阻塞模型没有I/O中断?
阻塞 I/O 代码更容易编写,除非您开始使用多个线程来编写代码,在这种情况下它可能不再容易。当我写一个一次性使用脚本(不是服务器)比如一个脚本来处理我硬盘上的一堆文件时,我有时会使用文件I/O的同步版本,比如fs.readFileSync()
因为它更简单,更容易编写。仅供参考,我从不在服务器中使用同步 I/O(除了在服务器初始化时),因为它在实时请求中使用时会破坏服务器的可伸缩性。
作为同步 I/O 更简单的示例,require()
使用同步文件 I/O。如果没有,那么初始化一个有多个外部模块要加载的模块(其中一些相互依赖)可能比在连续的行中排列四个 require()
语句要复杂得多。
非阻塞 I/O 代码需要学习新技术才能序列化多个 I/O 请求(学习回调或承诺),但允许您编写可扩展的代码而不必担心关于线程同步,并且不会冒多线程代码中经常出现的错误的风险。
我刚开始学习node.JS。而且我发现有两种模型:阻塞和非阻塞。
我知道非阻塞可以同时执行 I/O 个请求,而阻塞模型必须等待 I/O 响应,然后再执行另一个 I/O 请求。
但是,如果我们同时做两个I/O请求,可能还是会有I/O中断。所以我在这里有点困惑。
所以我的问题是:
看起来非阻塞模型肯定比阻塞模型好,那为什么我们需要阻塞模型?
为什么非阻塞模型没有I/O中断?
阻塞 I/O 代码更容易编写,除非您开始使用多个线程来编写代码,在这种情况下它可能不再容易。当我写一个一次性使用脚本(不是服务器)比如一个脚本来处理我硬盘上的一堆文件时,我有时会使用文件I/O的同步版本,比如fs.readFileSync()
因为它更简单,更容易编写。仅供参考,我从不在服务器中使用同步 I/O(除了在服务器初始化时),因为它在实时请求中使用时会破坏服务器的可伸缩性。
作为同步 I/O 更简单的示例,require()
使用同步文件 I/O。如果没有,那么初始化一个有多个外部模块要加载的模块(其中一些相互依赖)可能比在连续的行中排列四个 require()
语句要复杂得多。
非阻塞 I/O 代码需要学习新技术才能序列化多个 I/O 请求(学习回调或承诺),但允许您编写可扩展的代码而不必担心关于线程同步,并且不会冒多线程代码中经常出现的错误的风险。