查看NodeJS bcrypt包(https://www.npmjs.com/package/bcrypt),似乎有异步/同步功能对:
我理解在函数具有I / O(例如磁盘或网络访问)的情况下异步函数的目的,以便不阻止事件循环。但是如上所述,没有I / O,使用异步版本有什么优势呢?
选择同步版本会有什么损失?我想这样做是因为它使代码更简单,我看不出任何不利因素。
在https://stackoverflow.com/a/11606391/779159中,它说“如果可能的话,你想要使用异步版本,这样你就不会在密码哈希期间占用你的节点处理”,但是不管怎样你的代码都不会被绑定它是由这些功能而不是I / O使用的CPU吗?
答案 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由繁重的计算功能组成。通过旋转新的执行器,它不会更快(甚至可能更慢),但至少可以在计算失败时处理其他动作。