网络工作者是否使用演员模型?

dar*_*tea 6 html actor-model web-worker

我一直在努力了解演员模型和网络工作者是如何工作的。

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

对我来说,这听起来与演员模型非常相似。有区别吗?

更新:根据 Benjamin Erb 的说法:

"actor 模型的基本思想是将actor 用作并发原语,可以以不同的方式对接收消息进行操作:

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

前两个适用,但最后一个怎么样?

Tom*_*ica 5

是的,actor 模型很好地描述了工人的工作方式。然而,actor 模型有一些更抽象的要求,这些要求也取决于您的实现——但我建议遵守actor 模型。您可以在 Wikipedia 上阅读全文

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

对消息到达顺序没有要求

这取决于您的实施,我强烈建议遵守此要求。这意味着,例如,如果以块的形式发送数据,则给出块索引。Worker 消息按照它们发送的顺序到达,但是一旦您的代码变得复杂,最好不要依赖它。

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

这一点与上一点是有冲突的。但是任何至少阅读过一些 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});
  }
});
Run Code Online (Sandbox Code Playgroud)

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


如果您对 actor 模型感兴趣,还可以查看 javascript 实现Vert.x

注意:有多种方法可以在 Worker 之间进行阻塞,但这些都是 hack 并且不是故意的。我能想到的一种是服务器持有锁的异步 XHR。我不认为这算作演员模型的例外。