Node 的加密模块是否阻止,即使对于未定义为同步的方法也是如此

Is Node's Crypto module blocking even for methods that are not defined as sync

本文关键字:同步 未定义 方法 是否 模块 加密 Node      更新时间:2023-09-26

有人可以澄清一下 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++ 中对主线程进行所有计算,但这仍然是与事件循环相同的线程。

您的代码段实际上不是异步的,实际上也不是非阻塞的。接口仅看起来是异步的。它仍然会占用事件循环的时间。

对于真正的异步加密方法和更好的吞吐量,请使用加密异步。