Javascript 什么';如果NodeJS异步函数没有';不使用任何I/O?

Javascript 什么';如果NodeJS异步函数没有';不使用任何I/O?,javascript,node.js,asynchronous,express,bcrypt,Javascript,Node.js,Asynchronous,Express,Bcrypt,在NodeJS bcrypt包()中,似乎有两对异步/同步函数: genSalt/genSaltSync 哈希/哈希同步 比较/比较同步 我理解异步函数在具有I/O(如磁盘或网络访问)的情况下的用途,以避免阻塞事件循环。但是对于像上面这样没有I/O的情况,使用异步版本有什么好处呢 选择同步版本会有什么损失?我之所以这么做,是因为它使代码更简单,我看不出这有什么坏处 其中说“如果可能的话,您希望使用异步版本,这样您就不会在密码散列过程中占用节点处理”,但您的代码不会被占用,因为这些函数使用的是

在NodeJS bcrypt包()中,似乎有两对异步/同步函数:

  • genSalt/genSaltSync
  • 哈希/哈希同步
  • 比较/比较同步
我理解异步函数在具有I/O(如磁盘或网络访问)的情况下的用途,以避免阻塞事件循环。但是对于像上面这样没有I/O的情况,使用异步版本有什么好处呢

选择同步版本会有什么损失?我之所以这么做,是因为它使代码更简单,我看不出这有什么坏处


其中说“如果可能的话,您希望使用异步版本,这样您就不会在密码散列过程中占用节点处理”,但您的代码不会被占用,因为这些函数使用的是CPU而不是I/O?

如果您使用异步版本,其他代码仍然可以运行。例如:

异步的 将打印:

interval 107
interval 214
starting hashing
interval 315
interval 415
interval 515
hashing done
interval 615
同步 代码的同步版本如下所示:

var startTime = new Date;

setInterval(function() {
    console.log('interval ' + (new Date - startTime));
}, 100);


setTimeout(function() {
    console.log('starting hashing');
    bcrypt.hashSync('bacon', 12);
    console.log('hashing done');
}, 300);
并输出如下内容

interval 105
interval 212
starting hashing
hashing done
interval 535
interval 635

我不确定它是如何在bcrypt模块内部完成的,也许它是一个新线程,因为它是本机代码?我想您可以查看bcrypts源代码以了解详细信息。

我已经仔细查看了bcrypts的本机代码,但没有发现任何可能阻塞的内容。那里的所有操作基本上都是CPU限制的


我认为这可以归结为优先权。bcrypt由繁重的计算函数组成。通过旋转新的执行器,它不会更快(甚至更慢),但至少在计算停止时可以处理其他操作

除了明显的“您必须等待”之外,在这种情况下可能没有任何等待。@DaveNewton,即使代码是异步的,您不也必须等待吗?NodeJS不会将操作交给另一个线程来完成这些函数所需的CPU工作。这两种情况下都会阻止事件循环,对吗?取决于它是如何实现的。非常有趣!如果使用同步版本的函数进行比较,是否可以添加等效代码和输出?在这一点上,我想我会清楚地理解差异,并将此标记为已接受的答案,非常感谢!当然,我也在间隔日志中添加了一些计时,以便更清楚地了解正在发生的事情。您所写的并不能证明什么。因为bcrypt不阻塞,所以代码无论如何都会运行。是的,这就是我试图展示的区别。问题中的论点是bcrypt会阻止任何一种方式,因为它不是IO绑定的,而它不是。如果bcrypt是用纯javascript编写的,则必须使用setImmediate来执行循环,以便生成与第一个示例相同的输出。(不清楚它是否能正常工作)
interval 105
interval 212
starting hashing
hashing done
interval 535
interval 635