如果函数不使用任何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其他的操作可以在计算停止的时候被处理。