在Node.js中多次调用计算量大的函数的最快方法

问题描述 投票:1回答:1

我有一个函数,在计算上有些昂贵,在这里我们谈论的是2–5ms。

function heavyWork() {
  // ...
}

heavyWork()被我的代码的不同部分立即调用了几次,这会阻塞Node.js的事件循环。我曾考虑过使用child_process.fork将其移至子进程,但是即使仅发送约500条IPC消息也需要与在主进程中进行计算相同的时间。从理论上讲,我可以使用此解决方案,它比以前慢了一点,并且不会阻塞事件循环,尽管我想加快速度。

我尝试的另一件事是使用child_process.fork。但是产生许多线程显然比以前的方法还要慢。

我可能必须先找到一种将消息发送给工作进程之前批处理消息的方法,除非我尚未尝试过在Node中实现该消息的方法。有什么想法吗?

node.js
1个回答
1
投票

我不知道有什么解决方案。我认为创建批次是最好的选择。

我会考虑的一些事情:

  • 是否可以缓存结果?
  • 使用setInterval来确保我在派遣之前不等待批处理填满。
  • 创建一个partioner函数,负责评估工作的分配方式。例如。如果当前批处理很小,则只需在主线程上运行它。分配器可以查看不同核心的负载,然后相应地分配负载。另外,如果我只有1个核心和2个线程,则批处理大小应该比我有4个核心和8个线程的情况下小。
  • 为了帮助我的伙伴,我还可以围绕我的heavyWork函数创建一个包装器,该包装器表示预期的工作负载为1-5,其中5是非常占用CPU的工作
  • 根据经验,我产生的工作线程不会超过内核数的2倍。这减少了交换的风险

Worker Threads

© www.soinside.com 2019 - 2024. All rights reserved.