如果函数不使用任何I / O,NodeJSasynchronous函数的目的是什么?

查看NodeJS bcrypt包( https://www.npmjs.com/package/bcrypt ),似乎有一对async / syncfunction:

  • genSalt / genSaltSync
  • 散列/ hashSync
  • 比较/ compareSync

我了解asynchronous函数的用途,在函数具有I / O(如磁盘或networking访问)的情况下,以免阻塞事件循环。 但是,像上面这样的情况下,没有I / O的情况下,使用asynchronous版本有什么优势?

select同步版本会损失什么? 我想这样做,因为它使更简单的代码,我看不出有任何缺点。

在https://stackoverflow.com/a/11606391/779159中,它表示“如果可能的话,您希望使用asynchronous版本,这样您就不会在密码散列期间占用您的节点处理”,但是您的代码不会无论如何,因为这些function使用的是CPU,而不是I / O,所以会受到阻碍吗?

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

asynchronous

var startTime = new Date; setInterval(function() { console.log('interval ' + (new Date - startTime)); }, 100); setTimeout(function() { console.log('starting hashing'); bcrypt.hash('bacon', 12, function (done) { console.log('hashing done'); }); }, 300); 

将打印:

 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来源的细节。

我仔细研究了bcrypt的本地代码,我没有看到任何可能阻塞的东西。 所有的操作基本上都是CPU绑定的。

我认为它归结为优先。 bcrypt包含繁重的计算function。 通过纺出新的执行者,它不会更快(甚至更慢),但是至less其他的操作可以在计算停止的时候被处理。