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

5

我一直认为JS是单线程语言,这使其在处理需要大量CPU的任务时效率低下。最近我了解到worker threads以及它是如何通过在一个进程下创建“多个工作线程”来解决这个效率问题的。进程和线程有什么区别?为什么JS突然能够生成多个worker线程,这些线程可以与主JS线程进行交互以实现并发?你能帮助我用通俗易懂的语言理解这个话题吗?谢谢。


3
这是一篇非常不错的文章,其中包含一个简单的示例。其主要思想是,对于 CPU 密集型进程(例如计算质数列表),可以使用工作线程。另外,这篇文章更好地解释了 Node.js 如何保持单线程但同时使用工作线程。 - Brent George
1
在Linux上,线程和进程之间的区别非常小,因为它们使用相同的原语但具有不同的配置。在Windows和MacOS上,进程和线程之间存在很大的差异。 - slebetman
1个回答

8

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

如果专门分配为SharedMemory(例如SharedArrayBuffer),则可以直接共享内存,但这样做会导致两个线程之间访问共享内存时存在竞争条件。因此,在修改共享内存时,必须使用原子操作或自己的并发管理方案来防止竞争条件。

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

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

您也可以通过创建多个nodejs进程来执行类似的操作。但是,进程比workerThread更重,而workerThread允许您使用SharedMemory共享内存,而单独的进程则不行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接