我一直认为JS是单线程语言,这使其在处理需要大量CPU的任务时效率低下。最近我了解到worker threads以及它是如何通过在一个进程下创建“多个工作线程”来解决这个效率问题的。进程和线程有什么区别?为什么JS突然能够生成多个worker线程,这些线程可以与主JS线程进行交互以实现并发?你能帮助我用通俗易懂的语言理解这个话题吗?谢谢。
我一直认为JS是单线程语言,这使其在处理需要大量CPU的任务时效率低下。最近我了解到worker threads以及它是如何通过在一个进程下创建“多个工作线程”来解决这个效率问题的。进程和线程有什么区别?为什么JS突然能够生成多个worker线程,这些线程可以与主JS线程进行交互以实现并发?你能帮助我用通俗易懂的语言理解这个话题吗?谢谢。
从node v10开始,它们引入了WorkerThreads。 WorkerThread是全新的V8 Javascript解释器实例。它有自己的变量集、全局变量和运行Javascript的线程。您不能在主线程和一个workerThread或workerThreads之间直接共享普通的Javascript变量。
如果专门分配为SharedMemory(例如SharedArrayBuffer),则可以直接共享内存,但这样做会导致两个线程之间访问共享内存时存在竞争条件。因此,在修改共享内存时,必须使用原子操作或自己的并发管理方案来防止竞争条件。
主线程和workerThreads可以相互发送消息,并且这些消息可以包含某些数据结构,这些数据结构将通过结构化克隆机制进行复制并发送到另一个V8实例。
workerThreads的想法是,它们非常适合用于将CPU密集型代码从主事件循环中移出(特别适用于服务器),因此您可以启动一个或多个workerThreads来处理CPU密集型工作,并保持主线程事件循环空闲并响应传入的事件/网络等。
您也可以通过创建多个nodejs进程来执行类似的操作。但是,进程比workerThread更重,而workerThread允许您使用SharedMemory共享内存,而单独的进程则不行。