multithreading - Web-Wokers,并发还是并行?
问题描述
关于 web-workers 的博客很多,但似乎人们不了解并发和并行的区别。有些人把它写成并行执行,其余的把它写成并发。
谁能帮我解决这个困惑?
解决方案
听起来可能存在理解这两个术语之间的区别的问题...
我邀请您阅读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 上下文。
推荐阅读
- javascript - Angular 6:HTML 插值中的函数调用返回未定义
- jquery - 无法在树视图中从 Font Awesome 切换类
- parsing - Teradata:获取大型可变文本字段的特定部分
- react-native - 关于 FlatList renderItem 组件性能和内存使用的问题
- sql - SQL select 语句返回一组事件在同一 ID 上多次发生的记录
- excel - Excel VBA - 通过另一个单元格更改单元格值?
- hangouts-chat - 机器人或脚本接管环聊对话
- c# - 是否可以将使用 IModelValidator 制作的验证属性应用于模型类?
- webpack - 使用 webpack 运行 yarn watch 问题
- git - Git Diff 返回二进制文件不同但没有实际行