上是由于工人不寻常的人体工程学原理。 JavaScript 的并发模型 任何想要使用 Workers 的应用程序都必须调整其架构以满足 Workers 的要求。JavaScript 实际上支持两种截然不同的并发模型通常归为主线程外架构这一术语。两者都使用 Workers但方式非常不同并且各自带来了自己的一套权衡。任何给定的应用程序通常都会在这两个极端之间结束。 并发模型 1参与者 我个人倾向于将 Workers 视为 Actor正如Actor 模型中所描述的那样。Actor 模型最流行的化身可能是编程语言 Erlang。每个参与者可能会或可能不会在单独的线程上运行并完全拥有其正在操作的数据。
没有其他线程可以访问它因此
不需要像互斥锁这样的渲染同步机制。参与者只能互相发送消息并对收到的消息做出反应。 举个例子我经常将主线程视为拥有 DOM 以及所有 UI 的参与者。它负责更新 UI 并捕获输入事件。另一个因素可能是负责应用程序的状态。DOM actor 将低 英国电话号码清单 级输入事件转换为应用程序级语义事件并将它们发送到状态 actor。状态参与者根据其接收到的事件改变状态对象可能使用状态机或者甚至涉及其他参与者。一旦状态对象被更新它就会将更新后的状态对象的副本发送给 DOM actor。DOM actor 现在根据新的状态对象更新 DOM。Paul Lewis 和我曾经在 2018 年 Chrome 开发峰会上探讨了以参与者为中心的应用架构。
消息都需要复制这需要多长时间不仅取决于消息的
大小还取决于运行应用程序的设备。根据我的经验postMessage 通常足够快但在某些情况下却不够。另一个问题是在将代码移至工作线程以释放主线程与同时必须支付通信开销和工作线程在响应消息之前 B2C 电话列表 忙于运行其他代码之间取得平衡。如果不小心工作人员可能会对UI 响应能力产生负面影响。 您可以通过 postMessage 发送的消息非常复杂。底层算法(称为结构化克隆)可以处理循环数据结构甚至可以处理Map和Set。但是它无法处理函数或类因为代码无法在 JavaScript 中跨作用域共享。有点令人恼火的是尝试向函数发送消息会引发错误而类只会默默地转换为普通 JavaScript 对象从而丢失该过程中的方法(这背后的细节很有意义但会超出本文的范围