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 上下文。
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 上下文。