看到一个问题,想请问各位前辈
发布于 9 年前 作者 hc2014 5331 次浏览 最后一次编辑是 8 年前 来自 问答

问题:Node 自诩异步编程是它的优势,为什么在引用外部包的时候(require()函数)是同步方法,而非异步方法

我的理解是,模块之间可能有依赖关系,同步能够保证加载的顺序。 请各位前辈,讲解一下(请无视我自己的理解o(╯□╰)o)

9 回复

自己先顶一个

因为,这个地方如果改成异步,麻烦多于便利。异步的目的是什么?不是为了异步而异步。如果说 require 模块的话,模块都在本地,同步异步效率都很高啊。

支持:【不是为了异步而异步】
这个其实也应该加入到9 anti-patterns里面

@alsotang 不是为了异步而异步,这个很不错,但是还不足以全面解释这个问题,而且我不懂为什么模块在本地的话,同步比异步要快呢? 顺便说下,这个问题是我再知乎上看到的,是一道面试题目!

IO 只发生在第一次 require 的时候,所以在这里用同步应该还是可以接受的

  1. 麻烦。依赖次序保证需要用多次callback,嵌套太深
  2. 必要性不大。 2.1 要require的肯定都是本地文件 2.2 源代码文件通常也不大 2.3 也只装在一次。 因此耗时可控。

node的库里面唯有fs模块是同时有同步和异步api,而涉及到网络(肯定被硬盘慢),数据库(计算密集)都是异步的,根本没有提供同步的,可见文件,网络,数据库的压力级别根本不同。

同样是阻塞,也要分级,从cpu cache,RAM,DISK ,NETWORK ,有数量级的差别。

看图

http://blog.mixu.net/files/2011/01/io-cost.png

@1000copy 这个解释很好的说 我之前稍微思考过这个LZ说的这个问题。require也要是异步?不过你的解释我个人觉得蛮到位的。

@1000copy 说的对 不过我觉得网络和数据库通信如果使用同步导致node.js线程阻塞的主要原因是,网络延时和其他服务器端负载等不可控制的原因,而非io、cpu、内存等压力。 就好像在浏览器端,用xhr同步方式请求http,也会导致js线程阻塞

回到顶部