【问题标题】:What is the disadvantage of non-blocking model? [duplicate]非阻塞模型的缺点是什么? [复制]
【发布时间】:2018-06-24 14:28:52
【问题描述】:

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

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

但是,如果我们同时执行两个 I/O 请求,仍然可能存在 I/O 中断。所以我在这里有点困惑。

所以我的问题是:

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

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

【问题讨论】:

  • 欢迎,请阅读tour,然后是How to Ask,然后是minimal reproducible example。此外,SO 上有 3,000 多个现有结果用于“node.js 阻塞”,你读过其中的任何一个吗?
  • @DaveS 很抱歉提出重复的问题,我将其标记为关闭。我是新来的,所以当我在那里输入问题并且由于某种原因没有得出任何结果时,我认为没有答案。我刚刚又搜索了一次,这次确实有结果。无论如何,谢谢你的提醒。
  • 我们曾经都是新来的 :) 。在这里和使用 Google 搜索总是值得一试的,因为现有的问题可能会为您提供答案而无需等待,并且提供的信息比快速回答您自己的问题要多得多。

标签: node.js blocking nonblocking


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2011-04-24
    • 2012-01-15
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多