网络工作者是否使用演员模型?
Do web workers use actor model?
我一直在努力理解 actor 模型和 web workers 是如何工作的。
在https://dzone.com/articles/html5-web-workers-classic中:
"Web Workers provide a message-passing model, where scripts can communicate only through well-defined immutable messages, do not share any data, and do not use synchronization mechanisms for signaling or data integrity."
对我来说,这听起来很像演员模型。有区别吗?
更新:
根据 Benjamin Erb 的说法:
" actor 模型的基本思想是使用 actor 作为并发原语,它们可以以不同的方式接收消息:
1.Send 向其他参与者发送有限数量的消息。
2. 生成有限数量的新演员。
3.改变自己的内部行为,在处理下一条传入消息时生效。"
前两个适用,最后一个呢?
是的,actor 模型很好地描述了 worker 是如何工作的。然而,actor 模型有一些更抽象的要求,这些要求也取决于您的实现 - 但我建议遵守 actor 模型。您可以阅读 full article on Wikipedia.
不过我想向您指出一件事:
No requirement on order of message arrival
这取决于您的实施情况,我强烈建议您遵守此要求。这意味着,例如,如果以块的形式发送数据,则为块提供索引。工作消息按发送顺序到达,但一旦您的代码变得复杂,最好不要依赖它。
更改其自身的内部行为,在处理下一条传入消息时生效(根据您的“更新”)
这一点和前面的有冲突。但是任何至少阅读过一些 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 模型和 web workers 是如何工作的。
在https://dzone.com/articles/html5-web-workers-classic中: "Web Workers provide a message-passing model, where scripts can communicate only through well-defined immutable messages, do not share any data, and do not use synchronization mechanisms for signaling or data integrity."
对我来说,这听起来很像演员模型。有区别吗?
更新: 根据 Benjamin Erb 的说法:
" actor 模型的基本思想是使用 actor 作为并发原语,它们可以以不同的方式接收消息:
1.Send 向其他参与者发送有限数量的消息。
2. 生成有限数量的新演员。
3.改变自己的内部行为,在处理下一条传入消息时生效。"
前两个适用,最后一个呢?
是的,actor 模型很好地描述了 worker 是如何工作的。然而,actor 模型有一些更抽象的要求,这些要求也取决于您的实现 - 但我建议遵守 actor 模型。您可以阅读 full article on Wikipedia.
不过我想向您指出一件事:
No requirement on order of message arrival
这取决于您的实施情况,我强烈建议您遵守此要求。这意味着,例如,如果以块的形式发送数据,则为块提供索引。工作消息按发送顺序到达,但一旦您的代码变得复杂,最好不要依赖它。
更改其自身的内部行为,在处理下一条传入消息时生效(根据您的“更新”)
这一点和前面的有冲突。但是任何至少阅读过一些 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。我认为这不算演员模型的例外。