Node.js 多线程:什么是工作线程,它是如何工作的?

Node.js multithreading: What are Worker threads and how does it work?

我一直认为 JS 是一种单线程语言,这使得它在 CPU 密集型任务中效率低下。我最近遇到了工作线程,以及它如何通过创建“一个进程下的多个工作线程”来解决这个低效率问题。进程和线程有什么区别?为什么 JS 突然能够生成多个工作线程来帮助主 JS 线程并与之交互以实现并发?你能帮我通俗地理解这个话题吗?谢谢

从节点 v10 开始,他们引入了 WorkerThreads。 WorkerThread 是 V8 Javascript 解释器的全新实例。它有自己的一组变量、自己的全局变量和自己的 运行 Javascript 线程。您不能在主线程和 workerThread 之间或 workerThreads 之间直接共享常规 Javascript 变量。

如果内存被专门分配为 SharedMemory,例如 SharedArrayBuffer,您可以直接共享内存,但是这样做时,您将面临两个访问共享内存的线程之间的竞争条件。因此,您必须使用 Atomics 或您自己的并发管理方案来防止在修改共享内存时出现竞争条件。

主线程和 workerThreads 可以相互发送消息,这些消息可以包含某些类型的数据结构,这些数据结构将通过结构化克隆机制复制并发送到另一个 V8 实例。

workerThreads 背后的想法是,它们对于从主事件循环中获取 CPU 密集型代码很有用(对服务器特别有用),因此您可以启动一个或多个 workerThreads 来处理 CPU 密集型工作并保持主要的 thead 事件循环自由并响应传入 events/networking/etc...

您也可以通过创建多个 nodejs 进程来做类似的事情。但是,进程比 workerThread 更重,workerThreads 允许您与 SharedMemory 共享内存,而单独的进程则不允许。