Web-Wokers,并发还是并行?

Web-Wokers, Concurrent or Parallel?

web-workers 的博客很多,但是好像大家不太明白并发和并行的区别。 有的写成并行执行,有的写成并发执行。

谁能帮我解决这个困惑?

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

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

很难对您正在谈论的那些 "blogs" 发表评论,但无法阅读它们,但如果您想安全起见,请说 Worker context 运行 并发到 window 的上下文 .

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

例如,您可以启动比 number of threads available 更多的 Worker:

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

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


另请注意,即使两个上下文并行执行 运行,某些操作也需要一个上下文等待另一个上下文空闲。
例如,at init the worker's message port has to be "entangled" 具有主线程创建的临时端口,因此它可以存储传入的消息,直到 Worker 准备好处理它们。这种纠缠要求 Worker 等待父级上下文空闲,以便它可以传递它。
另一个例子是 OffscreenCanvas,其中 at least in Chrome's implementation,Worker 必须等待主线程空闲,以便它可以访问相同的 GPU 上下文。