Node 的加密模块是否阻止,即使对于未定义为同步的方法也是如此
Is Node's Crypto module blocking even for methods that are not defined as sync
有人可以澄清一下 Node 的加密模块是否阻塞吗? 根据我认为我的理解,一些核心模块可以在 c++ 中产生一个单独的线程。
我主要对以下方面感兴趣:
- crypto.createHmac
- crypto.createSign
- crypto.createVerify
如果它确实在单独的线程上处理,那么很好。 如果没有,那么我可能不得不考虑使用集群模块。 我试图避免阻塞主事件循环。
这是我如何实现crypto.createHmac的一个小例子。
function createHmac(algo, secret, data, callback) {
var cryptoStream = crypto.createHmac(algo, secret);
// Emitters
cryptoStream
.on('error', function (err) {
return callback(err);
});
// Write the data
cryptoStream.write(data, 'utf8', function(){
cryptoStream.end();
return callback(null, cryptoHmacStream.read());
});
}
您列出的"crypto.create*"函数是同步和阻塞的,但是,它们非常简单,只是设置了一些基本的数据结构。它们不执行任何繁重的加密计算,这在异步非阻塞方法中稍后会发生。因此,可以在主事件循环中调用这些。就开销而言,它们与执行基本的字符串操作、正则表达式匹配等没有什么不同,不需要特殊处理。您不需要群集模块。您的代码段已经是异步和非阻塞的,因为cryptoStream
通过事件发射器模式是异步的。write
方法是异步的,这是重要的部分。
为了与前面的答案相矛盾,据我了解,crypto.createHmac
方法在 C++ 中对主线程进行所有计算,但这仍然是与事件循环相同的线程。
您的代码段实际上不是异步的,实际上也不是非阻塞的。接口仅看起来是异步的。它仍然会占用事件循环的时间。
对于真正的异步加密方法和更好的吞吐量,请使用加密异步。
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- 要求未定义JS回调参数
- 如何检查管道中未定义的项目
- TypeError:无法读取属性'推'未定义的JavaScript
- $window.ga在AngularJS事件中未定义
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 无法获取属性'selectedIndex'的未定义引用或null引用
- 如何消除代码中的未定义和其他问题
- 未捕获的ReferenceError:$未定义
- this.router在AngularJS 2中未定义
- 未捕获的类型错误:无法读取属性'删除'的未定义
- 节点fs.stat名称未定义
- 尝试在PHP中回显输入文本时出现未定义的索引错误
- Jquery未定义函数正在停止其他操作
- AngularJS指令出错-无法读取属性'编译'的未定义
- 这.SOMETHING 总是返回未定义的 - extjs
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- Node 的加密模块是否阻止,即使对于未定义为同步的方法也是如此
- 与异步和同步函数相关的未定义javascript函数的问题