正如上一篇所描述的那样,通用编程实践并不能恰当地知足要求现代系统的需求。谢天谢地,咱们不须要把咱们所知道的所有都废弃了。相反,角色模型以必定原则方式解决这些缺点,让系统可以以更好的方式与咱们的心智模式相匹配。角色模型抽象容许您从通讯方面考虑您的代码,而不是像大型组织中的人之间发生的交换。html
角色模型容许咱们:编程
Actor不是调用方法,而是互相发送消息。发送消息不会将执行线程从发送方传输到目标,Actor能够发送消息并继续而不会阻止。所以,它能够在相同的时间内完成更多。缓存
对于对象,当方法返回时,它释放对其执行线程的控制。在这方面,actor的行为与对象很是类似,它们在完成处理当前消息时对消息做出反应并返回执行。经过这种方式,Actor实际上实现了咱们想象的对象的执行:网络
传递消息和调用方法之间的一个重要区别是消息没有返回值。经过发送消息,Actor将工做委托给另外一个Actor。正如咱们在回调的错觉中看到的那样,若是它指望返回值,则发送方须要阻止或在同一线程上执行其余Actor的工做。相反,接收者将结果传递给回复消息。ide
咱们模型中须要的第二个关键变化是恢复封装(reinstate encapsulation)。Actor对消息做出反应,就像对象“响应”它们上调用的方法同样。不一样之处在于,不是多个线程“响应”到咱们的Actor中而且对内部状态和不变量形成严重破坏,Actor独立于消息的发送者执行,而且他们一次一个地顺序响应传入的消息。当每一个Actor按顺序处理发送给它的消息时,不一样的Actor会相互同时工做,这样Actor系统就能够同时处理硬件支持的消息。ui
因为每一个actor最多只能处理一条消息,所以能够保持actor的不变量而不synchronization。这种在不使用锁的状况下使用:spa
总之,这是Actor收到消息时发生的事情:操作系统
为了实现这种行为,Actor有:线程
消息进入Actor邮箱。该角色的行为描述了角色如何响应消息(好比发送更多消息和/或更改状态)。执行环境将线程池从新设置为彻底透明地驱动全部这些操做。htm
这是一个很是简单的模型,它解决了之前列举的问题:
因为咱们再也不在发送消息的Actor之间拥有共享调用堆栈,所以咱们须要以不一样方式处理错误状况。咱们须要考虑两种错误:
主管(父母)能够决定在某些类型的故障中从新启动其子actor,或者彻底阻止其余人。孩子们永远不会沉默地死去(除了进入无限循环以外),他们要么失败,要么他们的父母能够对错误做出反应,或者他们被中止(在这种状况下,有关方会自动获得通知)。老是有一个负责任的实体来管理一个演员:它的父母。从外部看不到从新启动:协做actor能够在目标actor从新启动时继续发送消息。
下一章,让咱们简要介绍一下Akka提供的功能。
原文:https://doc.akka.io/docs/akka/current/guide/actors-intro.html
有什么讨论的内容,能够加我公众号: