nad*_*dia 3 java multithreading scala actor akka
我试图理解Actors和线程的定义差异.有些文章称actor是轻量级线程,而其他文章则声明actor不是线程.我也明白一个线程可以运行多个actor.我很困惑如何将角色与线程完全区分开来.请帮我理解谢谢!
Raj*_*kam 12
与线程相比,Actor具有更高的抽象级别.
Thread是一个JVM概念,而Actor是一个在JVM中运行的普通java类,因此问题不在于Actor vs Thread,而是关于Actor 如何使用Threads的问题.
什么是演员?
在一个非常简单的层面上,Actor是一个接收消息的实体,一次一个,并对这些消息做出反应.
Actor如何使用Threads?
当演员接收消息时,它执行一些动作响应.动作代码如何在JVM中运行?同样,如果你只是这种情况,你可以对在当前线程上执行动作任务的Action进行成像.此外,Actor可能决定在线程池上执行操作任务.只要Actor确保一次只处理一条消息,这并不重要.
我试图了解Actor和线程的定义差异。
老实说,他们之间确实没有多大关系,因此很难谈论他们之间的区别。这就像在谈论丰田凯美瑞和蓝色之间的区别。
Actor是一个自包含的封装实体,仅通过发送消息即可与其他自包含的封装实体进行通信。
现在,如果听起来完全像 Object对你来说,你是对的!演员和对象之间有着深厚的联系:演员的计算模型是卡尔·休伊特(Carl Hewitt)构思的,部分基于早期Smalltalks的消息导向执行(Smalltalk-71,Smalltalk-72)。反过来,艾伦·凯(Alan Kay)则将PLANNER的目标导向执行视为对Smalltalk的消息导向执行的重大影响……PLANNER由卡尔·休伊特(Carl Hewitt)设计。(PLANNER也是Prolog的前身,而Prolog也是Erlang的前身; Erlang基于Prolog,最初是Prolog中的一个库,而第一个实现是用Prolog编写的。)此外,Carl Hewitt和Alan Kay引用了Vint Cerf和Bob Kahn在后来成为互联网的灵感方面的早期工作,他们俩都受到大自然的启发,物理学的卡尔·休伊特(Carl Hewitt)和微生物学的艾伦·凯(Alan Kay)。因此,深层次的联系和相似之处不足为奇。
演员和对象几乎是同一回事。我们通常期望面向对象系统中的消息发送是同步的,即时的,可靠的和有序的,而Actor没有这样的保证。那是Actor和Object之间的主要区别:Actor是消息可能丢失,重新排序,花费很长时间并且是异步的对象。(唯一的保证是消息最多可以传递一次。)而且,消息的接收者通常没有对发送者的隐式引用,因此,如果接收者想要回复消息,则发送者需要传递自己的消息。参考和消息(不同于典型的面向对象系统,在该系统中我总是return
可以向发件人发送一些信息)。
演员可以做三件事,而这三件事恰好可以做:
请注意,为了向Actor发送消息,您需要具有Actor的地址。您只能将邮件发送到地址。一个Actor可能有多个地址,并且多个Actor可能隐藏在一个Address后面。地址是不可伪造的,您不能自己构建,必须将其交给您。(这是与C中的指针的重要区别,更像Java中的对象引用。)
微软的Channel9社区网站上有一个非常不错的录像带,上面有卡尔·休伊特本人和埃里克·梅耶尔之间关于演员的白板会议:休伊特,梅耶尔和Szyperski:演员模型(您想知道的一切,但是害怕问)。它以通俗易懂的方式解释了Actor背后的基本思想以及Actor的基本公理。
卡尔·休伊特(Carl Hewitt)还应邀在斯坦福大学EE380计算机系统学术讨论会上作了演讲,他在会议上谈到了如何为不一致的鲁棒性编程多个核,包括对演员的介绍。
线程,OTOH只是执行的一部分。它们本质上不过是指令指针和调用堆栈。特别是,线程没有(自己的)内存。进程的所有线程共享相同的内存。这意味着,单个行为异常的线程可能会使进程的所有线程崩溃,并且必须仔细控制对此共享内存的所有访问。
一些文章说参与者是轻量级线程,而另一些文章指出参与者不是线程。我也了解一个线程可以运行多个参与者。
您将Actor 的概念与可能的实现相混淆。
在现有环境中,Actor的一个非常简单的实现就是使每个Actor成为一个流程。例如,BEAM(Erlang的主要实现方式)就是这种方式。这是可行的,因为在BEAM上,过程非常便宜且轻巧。一个进程仅重约300 Byte,而十年前的廉价32位单核笔记本电脑上可能有数千万个进程。这会不会与Windows进程,例如,这是工作更加昂贵。
在JVM上还有一个Erlang的实现(称为Erjang),它使用Kilim,在JVM上使用字节码重写实现了非常轻量的Actors。(请注意,Erjang和Kilim似乎都已死亡。)
如果要在线程上实现Actors,则会遇到Actors完全隔离而线程完全共享的问题。因此,您需要以某种方式提供此隔离。
在诸如JVM之类的系统上实现Actor的一种常见方法是将Actor作为对象实现,然后安排它们在线程池上运行以获取异步属性。这就是Akka的工作方式。
我强烈建议先阅读官方文档:\n https://doc.akka.io/docs/akka/current/scala/general/actors.html
\n\n\n\n在幕后,Akka 将在一组真实线程上运行一组 actor,通常许多 actor 共享一个线程,并且一个 actor 的后续调用最终可能会在不同的线程上处理。Akka 确保这个实现细节不会影响处理 actor\xe2\x80\x99s 状态的单线程性。
\n
归档时间: |
|
查看次数: |
2009 次 |
最近记录: |