首页 > 解决方案 > Node.js 多线程:什么是工作线程,它是如何工作的?

问题描述

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

标签: javascriptnode.jsmultithreadingsingle-threadedworker-thread

解决方案


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

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

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

workerThreads 背后的想法是,它们有助于将 CPU 密集型代码从主事件循环中取出(对服务器特别有用),因此您可以启动一个或多个 workerThread 来处理 CPU 密集型工作并保持主线程事件循环空闲并响应传入事件/网络/等...

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


推荐阅读