Node.js nodejs工作线程可以用于执行长时间运行的基于文件I/O的javascript代码吗?

Node.js nodejs工作线程可以用于执行长时间运行的基于文件I/O的javascript代码吗?,node.js,multithreading,Node.js,Multithreading,我可以看到NodeJS通过其worker-threads模块引入了多线程支持。我目前的假设(我还没有亲自探索)是我可以将长时间运行/cpu密集型操作卸载到这些工作线程上 如果这段长时间运行的代码有一些间歇事件回调或承诺链,我想了解它的行为。这些回调是否仍在工作线程上执行,还是会传递回主线程 如果这些承诺回到主线程,那么执行辅助线程的优势可能会丧失 有人能澄清一下吗 更新=>问题的某些上下文 我有一个http req,它启动一些后台处理并返回202状态。在收到这样的请求后,我将通过 setTime

我可以看到NodeJS通过其worker-threads模块引入了多线程支持。我目前的假设(我还没有亲自探索)是我可以将长时间运行/cpu密集型操作卸载到这些工作线程上

如果这段长时间运行的代码有一些间歇事件回调或承诺链,我想了解它的行为。这些回调是否仍在工作线程上执行,还是会传递回主线程

如果这些承诺回到主线程,那么执行辅助线程的优势可能会丧失

有人能澄清一下吗

更新=>问题的某些上下文 我有一个http req,它启动一些后台处理并返回202状态。在收到这样的请求后,我将通过

setTimeout (function() { // performs long running file read operations.. })
并立即向来电者返回202

然而,我观察到,在这段时间内,当后台操作进行时,其他http请求要么没有被处理,要么非常缓慢

我的假设是,一百万行以上的连续I/O处理正在用回调/承诺填满事件循环,即主线程无法处理其他挂起的I/O任务,例如接受新请求

我已经研究了nodejs集群选项,这很有效,因为长任务被委托给一个子进程,集群的其他实例可以接受额外的请求


但是我认为工作线程可以解决同样的问题,而不需要克隆进程的开销。

我假设每个工作线程都有自己的事件循环

因此,如果在工作线程中发出事件,则只有该线程才会接收并触发回调。承诺也是如此,如果您在工作人员内创建了承诺,则该承诺将仅由该工作人员解决

他们在文档中的声明支持这一点:大多数Node.js API都在其中(有些例外情况与事件处理无关)

然而,他们在文件的前面提到了这一点:

worker对于执行CPU密集型JavaScript操作非常有用;不要将它们用于I/O,因为Node.js异步执行操作的内置机制已经比工作线程更有效地处理了它


我认为在工作线程中使用一些小规模异步代码是可以的,但是有更多的回调/承诺会影响性能。一些基准测试可以对此有所帮助。

我计划在一个工作线程上使用大文件读取(逐行)。看起来,所有的行读取器事件都在填充事件循环,因此在此期间不接受任何其他http请求,从而导致客户端超时。这就是我想要使用工作线程的背景。因此,我仍然怀疑工作线程是否是执行长时间运行的I/O的正确用例。对于这个用例,我最初的()实验并没有太大的成功。我得重新检查一下。还没有尝试使用节点11.10中本机可用的工作线程。我也没有尝试过工作线程,我会尝试自己做一些测试,但我认为如果在工作线程中进行同步读取,至少在理论上应该会获得更好的性能