html - 网络 worker 是否使用 Actor 模型?

标签 html web-worker actor-model

我一直在努力理解 actor 模型和 web workers 是如何工作的。

https://dzone.com/articles/html5-web-workers-classic : “Web Workers 提供了一种消息传递模型,其中脚本只能通过定义明确的不可变消息进行通信,不共享任何数据,也不使用同步机制来保证信号或数据完整性。”

对我来说,这听起来很像 Actor 模型。有区别吗?

更新: 根据 Benjamin Erb 的说法:

"actor 模型的基本思想是将 actor 用作并发原语,它们可以以不同的方式在接收消息时采取行动:

1.向其他参与者发送有限数量的消息。
2. 生成有限数量的新 Actor 。
3. 改变自己的内部行为,在处理下一条传入消息时生效。"

前两个适用,但最后一个呢?

最佳答案

是的,actor 模型很好地描述了 worker 是如何工作的。然而,actor 模型有一些更抽象的要求,这些要求也取决于您的实现 - 但我建议遵守 actor 模型。您可以阅读 full article on Wikipedia .

不过,我想向您指出一件事:

No requirement on order of message arrival

这取决于您的实现,我强烈建议您遵守此要求。这意味着,例如,如果以 block 的形式发送数据,则为 block 提供索引。工作消息按发送顺序到达,但一旦您的代码变得复杂,最好不要依赖它。

更改其自身的内部行为,在处理下一条传入消息时生效(根据您的“更新”)

这一点和前面的有冲突。但是任何至少阅读过一些 web workers 教程的人,答案都是显而易见的:是的,worker 可以做到这一点。考虑以下代码:

var name = "Worker";
self.addEventListener("message", (e)=>{
  if(typeof e.data.newName=="string") {
    name = e.data.newName;
  }
  if(e.data.command == "sendName") {
    self.postMessage({myName: name});
  }
});

不用说,如果您向工作人员发送新名称,则对 "sendName" 消息的响应将与此不同。这种行为改变微不足道,但可以任意复杂。


如果您对 actor 模型感兴趣,另请参阅 javascript 实现 Vert.x .

注意:有一些方法可以在 Worker 之间进行阻塞,但这些都是 hack,不是故意的。我能想到的一种是服务器持有锁的异步 XHR。我不认为这算作 Actor 模型的异常(exception)。

关于html - 网络 worker 是否使用 Actor 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36654401/

相关文章:

html - 控制字幕文本

javascript - 需要从 html 数组中删除值

f# - 为什么 Akka.Net F# API 定义了 actorOf2 而不是 actorOf3、actorOf4 等?

scala - 是否可以/建议对 Akka 2 Actor 的不同 child 采取不同的监督策略?

java - java中的任何参与者模型是否允许完成任务分组?

javascript - 使用 html CSS 和 javascript 创建轮播的问题

html - 单击时更改 html svg cricle 的 css 填充

node.js - 如何在 WebWorkers 中浏览器化独立模块

处理大型数组时的 JavaScript 性能

javascript - 是否可以终止正在运行的网络 worker ?