非阻塞模型的缺点是什么?

What is the disadvantage of non-blocking model?

我刚开始学习node.JS。而且我发现有两种模型:阻塞和非阻塞。

我知道非阻塞可以同时执行 I/O 个请求,而阻塞模型必须等待 I/O 响应,然后再执行另一个 I/O 请求。

但是,如果我们同时做两个I/O请求,可能还是会有I/O中断。所以我在这里有点困惑。

所以我的问题是:

  1. 看起来非阻塞模型肯定比阻塞模型好,那为什么我们需要阻塞模型?

  2. 为什么非阻塞模型没有I/O中断?

阻塞 I/O 代码更容易编写,除非您开始使用多个线程来编写代码,在这种情况下它可能不再容易。当我写一个一次性使用脚本(不是服务器)比如一个脚本来处理我硬盘上的一堆文件时,我有时会使用文件I/O的同步版本,比如fs.readFileSync()因为它更简单,更容易编写。仅供参考,我从不在服务器中使用同步 I/O(除了在服务器初始化时),因为它在实时请求中使用时会破坏服务器的可伸缩性。

作为同步 I/O 更简单的示例,require() 使用同步文件 I/O。如果没有,那么初始化一个有多个外部模块要加载的模块(其中一些相互依赖)可能比在连续的行中排列四个 require() 语句要复杂得多。

非阻塞 I/O 代码需要学习新技术才能序列化多个 I/O 请求(学习回调或承诺),但允许您编写可扩展的代码而不必担心关于线程同步,并且不会冒多线程代码中经常出现的错误的风险。