我正在编写node.js插件来执行一些加密计算,这可能需要大约1μs - 20μs。现在我有一个选择:将它实现为同步或异步方法(在后台工作器上进行计算)?
很明显,网络和I / O(有时需要超过一毫秒)应该异步完成。解析JSON输入很快,应该同步完成。
在我的情况下,保持低延迟很重要,但优化微秒感觉就像过早优化一样。因此,考虑到这一背景,我有兴趣了解您对该问题的看法:
答案 0 :(得分:1)
为什么不将它作为同步AND实现为具有cryptAsync()
和cryptSync()
等2函数的异步方法?我觉得你做得更好也不困难。
答案 1 :(得分:1)
很明显,网络和I / O(有时需要超过一毫秒)应该异步完成。解析JSON输入很快,应该同步完成。
这不是那么明显。 Node有异步JSON解析器。参见:
但是,在CPU密集型操作的某些时候,您需要使用异步操作。我会说任何 CPU密集型逻辑不应该在阻塞事件循环的主线程中完成,应该在外部进程或worker中完成,或者在从C ++生成的线程中完成,以使其最大化对用户透明。
了解如何在bcrypt
和bcrypt-nodejs
中完成:
如果你可以让你的函数异步工作(不仅仅是在使用回调而是实际上没有阻塞事件循环),那么我建议至少使用两种API - 一个带回调的函数和一个函数返回一个承诺(在实践中可以是一个功能)。
目前使用async / await,您可以使用任何返回promise的函数,就好像它是同步的一样:
let x = await f();
let y = await g(x);
// ...
但在某些情况下,您需要一个真正的同步功能,例如,如果您想要一些可以直接从模块导出的东西:
module.exports = f();
这里f()
函数阻塞时没有任何危害,因为require()
本身也是阻塞的,你应该只在启动时使用它一次。但是如果函数是异步的 - 通过使用async
关键字声明并因此通过显式返回promise或通过回调隐式返回promise,那么您将无法从模块中导出值以某种方式使用它。
因此,如果您认为可以从模块导出函数的返回值,那么您可能还需要提供阻塞的同步版本。