首页 > 解决方案 > Web-Wokers,并发还是并行?

问题描述

关于 web-workers 的博客很多,但似乎人们不了解并发和并行的区别。有些人把它写成并行执行,其余的把它写成并发。

谁能帮我解决这个困惑?

标签: multithreadingconcurrencyparallel-processingprocessweb-worker

解决方案


听起来可能存在理解这两个术语之间的区别的问题...

我邀请您阅读Mason Wheeler的答案,而不是解释现有答案。
基本上,并发是一种状态,并行是实现这种状态的手段之一。

很难在无法阅读的情况下对您正在谈论的那些“博客”发表评论,但是如果您想安全起见,请说Worker context 与 window's context 并发运行

如何实现这种并发性会有所不同。在多线程 CPU 上,它实际上是并行的可能性很高,但即便如此,它也不是给定的。

例如,您可以启动比可用线程数更多的 Worker

for( let i = 0; i <= navigator.hardwareConcurrency; i++ ) {
  const worker = new Worker('worker-script.js');
}

这里至少有两个上下文将共享同一个 CPU 线程,这意味着这些上下文不会并行运行,而是可能通过任务切换来运行。


另外,即使两个上下文确实并行运行,某些操作也会要求一个上下文等待另一个上下文空闲。
例如,在初始化时,worker 的消息端口必须与主线程创建的临时端口“纠缠” ,以便它可以存储传入的消息,直到 Worker 准备好处理它们。这种纠缠要求 Worker 等待 parent 的 context 空闲,以便它可以传递它。
另一个例子是 OffscreenCanvas,至少在 Chrome 的实现中,Worker 必须等待主线程空闲,以便它可以访问相同的 GPU 上下文。


推荐阅读