何时延迟太大而无法在NodeJS中选择同步计算?

时间:2017-05-15 13:16:01

标签: javascript node.js latency

我正在编写node.js插件来执行一些加密计算,这可能需要大约1μs - 20μs。现在我有一个选择:将它实现为同步或异步方法(在后台工作器上进行计算)?

很明显,网络和I / O(有时需要超过一毫秒)应该异步完成。解析JSON输入很快,应该同步完成。

在我的情况下,保持低延迟很重要,但优化微秒感觉就像过早优化一样。因此,考虑到这一背景,我有兴趣了解您对该问题的看法:

使用node.js时,(同步)调用必须阻塞多长时间才能决定在后台线程上异步运行它?

2 个答案:

答案 0 :(得分:1)

为什么不将它作为同步AND实现为具有cryptAsync()cryptSync()等2函数的异步方法?我觉得你做得更好也不困难。

答案 1 :(得分:1)

  

很明显,网络和I / O(有时需要超过一毫秒)应该异步完成。解析JSON输入很快,应该同步完成。

这不是那么明显。 Node有异步JSON解析器。参见:

但是,在CPU密集型操作的某些时候,您需要使用异步操作。我会说任何 CPU密集型逻辑不应该在阻塞事件循环的主线程中完成,应该在外部进程或worker中完成,或者在从C ++生成的线程中完成,以使其最大化对用户透明。

了解如何在bcryptbcrypt-nodejs中完成:

如果你可以让你的函数异步工作(不仅仅是在使用回调而是实际上没有阻塞事件循环),那么我建议至少使用两种API - 一个带回调的函数和一个函数返回一个承诺(在实践中可以是一个功能)。

目前使用async / await,您可以使用任何返回promise的函数,就好像它是同步的一样:

let x = await f();
let y = await g(x);
// ...

但在某些情况下,您需要一个真正的同步功能,例如,如果您想要一些可以直接从模块导出的东西:

module.exports = f();

这里f()函数阻塞时没有任何危害,因为require()本身也是阻塞的,你应该只在启动时使用它一次。但是如果函数是异步的 - 通过使用async关键字声明并因此通过显式返回promise或通过回调隐式返回promise,那么您将无法从模块中导出值以某种方式使用它。

因此,如果您认为可以从模块导出函数的返回值,那么您可能还需要提供阻塞的同步版本。