如果函数不使用任何I / O,NodeJS异步函数的用途是什么?

时间:2015-11-01 19:48:31

标签: javascript node.js asynchronous express bcrypt

查看NodeJS bcrypt包(https://www.npmjs.com/package/bcrypt),似乎有异步/同步功能对:

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

我理解在函数具有I / O(例如磁盘或网络访问)的情况下异步函数的目的,以便不阻止事件循环。但是如上所述,没有I / O,使用异步版本有什么优势呢?

选择同步版本会有什么损失?我想这样做是因为它使代码更简单,我看不出任何不利因素。

https://stackoverflow.com/a/11606391/779159中,它说“如果可能的话,你想要使用异步版本,这样你就不会在密码哈希期间占用你的节点处理”,但是不管怎样你的代码都不会被绑定它是由这些功能而不是I / O使用的CPU吗?

2 个答案:

答案 0 :(得分:3)

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

异步

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

答案 1 :(得分:0)

我仔细查看了bcrypt的本机代码,我没有看到任何可能阻止的内容。所有的操作基本上都是CPU限制的。

我认为归结为优先考虑。 bcrypt由繁重的计算功能组成。通过旋转新的执行器,它不会更快(甚至可能更慢),但至少可以在计算失败时处理其他动作。