Web Workers 和 Worker Threads 有什么区别?

22

我一直找不到任何资源来解释Web Workers(https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)和Worker Threads(https://nodejs.org/api/worker_threads.html#worker_threads_worker_threads)之间的区别。Web Workers已经存在多年,可以实现PWA,而Worker Threads是最近在Node.js中发布的。

据我理解,两者都只是允许JavaScript在多个线程中运行代码的方式。那么为什么Worker Threads被发布为“新”事物呢?

1个回答

26
Web Workers是一种存在于浏览器中的技术。
Worker Threads是一种存在于node.js中的技术。
它们有着相似的目标,但由于环境的差异,它们有着不同的实现方式。
据我理解,它们都是允许JavaScript在多个线程中运行代码的简单方式。
是的,你说得对。但是它们有一些限制,比如无法访问与主线程相同的变量,在浏览器中无法访问DOM。线程之间和主线程之间的通信通常通过消息传递来实现。
那么为什么Worker Threads被发布为一个“新”的东西呢?
在“新”的Worker Threads之前,Node.js没有能力在线程中运行JavaScript代码。Node.js从来没有Web Workers。Web Workers在浏览器中已经存在一段时间了。在Worker Threads之前,开发者必须使用多个进程来利用额外的CPU或者防止CPU密集型代码阻塞事件循环。现在,Node.js开发者可以通过Worker Threads来实现这一点。
一些开发者讨论了为什么Node.js的Worker Threads与浏览器的Web Workers不同,可以在这里阅读:https://github.com/nodejs/node/issues/43583

@MuhammadUmer - 现代操作系统也会为线程使用多个核心。 - jfriend00
1
@MuhammadUmer - 当线程实际执行时,它不会从一个核心跳到另一个核心,但如果操作系统将其时间片切换出来,让其他线程有机会运行,它可以回到任何一个核心,除非它绑定到特定的核心。此外,线程不会绑定到其父进程正在运行的核心上。请记住,在现代操作系统中,可能已经有许多其他线程是运行操作系统的维护部分。当我现在在我的Windows 10系统上查看Process Explorer时,已经有数百个线程了。 - jfriend00
1
最好澄清一下为什么他们没有在Node.js中直接实现Web Workers,而是创建了一个新的API,即这两个API有何不同。 - Ciro Santilli OurBigBook.com
1
我支持 @CiroSantilliOurBigBook.com 的问题,并请求详细解释简单答案“工作线程存在于服务器上,Web Worker存在于浏览器中,这就是为什么”。编辑:找到了一个讨论 https://github.com/nodejs/node/issues/43583 - undefined
1
@fedd - 我在我的回答中添加了你的链接作为一些不同原因的参考。 - undefined
显示剩余2条评论

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