在NodeJS中select同步计算的时延太大?

我正在编写一个node.js插件来执行一些encryption计算,这可能需要大约1μs – 20μs。 现在我有一个select:将其实现为同步或asynchronous方法(在后台工作者上进行计算)?

很显然,networking和I / O,有时需要超过一毫秒,应该asynchronous完成。 parsingJSONinput很快,应该同步完成。

在我的情况下保持低延迟是重要的,但优化离开微秒感觉很像过早的优化。 因此,考虑到这种情况,我有兴趣就这个问题提出你的看法:

当使用node.js时,(同步)调用需要阻塞多长时间,直到您决定在后台线程上asynchronous运行它为止?

很显然,networking和I / O,有时需要超过一毫秒,应该asynchronous完成。 parsingJSONinput很快,应该同步完成。

这并不明显。 有Node的asynchronousJSONparsing器。 看到:

但是确实,在CPU密集型操作的某个时刻,您需要使用asynchronous操作。 我会说任何 CPU密集型逻辑都不应该在阻塞事件循环的主线程中完成,并且应该在外部进程或工作者中完成,或者在C ++中产生的线程中完成,以使其对用户最大程度地透明。

看看它是如何在bcryptbcrypt-nodejs

如果你可以使你的函数asynchronous工作(不仅是在使用callback的意义上,而且实际上不阻塞事件循环),那么我会build议至less做两种API–一个函数,一个callback函数和一个返回promise的函数(这在实践中可以是一个function)。

目前与asynchronous/等待你可以使用任何函数返回一个承诺,就像它是同步的:

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

但是在某些情况下,你需要一个真正的同步function,就像你想要一些可以直接从模块中导出的东西一样:

 module.exports = f(); 

这里当f()函数被阻塞的时候,因为require()本身也被阻塞了,所以你不应该在启动时使用它。 但是,如果函数是asynchronous的 – 通过声明一个async关键字,从而隐式地返回一个promise,通过显式地返回一个promise或者通过callback,那么你将不能从一个模块中导出这个值,方法。

所以如果你认为你的函数的返回值可能从模块中导出是有意义的,那么你可能还需要提供一个阻塞的同步版本。

为什么不把它作为同步和asynchronous方法来实现,像cryptAsync()cryptSync()这样的2个函数? 我认为这样做比较好,也不难。