我一直在学习NodeJS上的多线程处理,以便更好地理解和提高代码在高负载环境下的性能。
虽然我理解如何利用资源来处理负载所需的基本目的和概念,但当我进一步深入时,会有一些问题,而且似乎在文档中找不到具体的答案。
NodeJS单线程:
NodeJS运行一个单线程,我们称之为事件循环,尽管在后台操作系统和Libuv正在处理I/O异步任务的默认工作池。
我们应该使用单个核心来处理事件循环,尽管工人可能使用不同的核心。我猜他们最终会被操作系统调度器排序。
NodeJS多线程:
使用“worker_threads”库时,在同一单个进程中,每个线程都运行不同的v8 / Libuv实例。因此,它们共享相同的上下文,并使用“消息端口”和其他API在线程之间进行通信。
每个工作线程都运行其自己的事件循环线程。线程应该明智地平衡在CPU核心之间,从而提高性能。我猜他们最终会被操作系统调度器排序。
问题1:当工作线程使用I/O默认工作池时,它们会与其他工作池共享相同的线程吗?还是每个工作者都有自己的默认工作者池?
NodeJS中的多进程:
当使用"cluster"库时,我们将工作分配给不同的进程。每个进程都设置在不同的核心上以平衡负载...好吧,最终设置在不同核心上的是主事件循环,因此它不与其他繁重的事件循环共享核心。听起来这么做很聪明。
在这里我将使用一些IPC策略进行通信。
问题2:这个NodeJS进程的默认工作池在哪里?像第一个情况中期望的那样在其他核心之间平衡吗?那么他们可能与集群的其他工作池在同一个核心上。我们是否应该说我们正在平衡主线程(事件循环)而不是"进程"呢?
所有这些都说了,主要问题是:
问题3:使用集群还是worker_threads更好?如果两者都在同一代码中使用,如何让这两个库达到最佳性能?它们会冲突吗?还是最终权限属于操作系统?