与线程相比,Actor如何工作?


88

与线程相比,Actor的工作原理有什么好的简短的解释?

线程不能被视为参与者并向其他线程发送消息吗?我看到了一些区别,但是对我来说还不清楚。我可以通过不同地使用线程来以任何语言使用Actor吗?

Answers:


78

角色模型对消息传递进行操作。允许各个进程(演员)彼此异步发送消息。这与我们通常认为的线程模型的区别在于,(至少在理论上)没有共享状态。而且,如果有人(合理地,我认为)认为共享状态是所有邪恶的根源,那么参与者模型就变得非常有吸引力。

但是,我们不应该过分兴奋。演员模型不会(与某些指控相反)使不可能陷入僵局。actor模型也不会阻止您争用不同进程之间的资源,例如消息队列。该模型仅在特定级别以上是“无锁的”。在较低级别上,为了协调消息队列,仍然需要锁定。

线程不能被视为参与者并向其他线程发送消息吗?

好吧,是的,不是。不,如果您只是使用在共享内存位置周围放置互斥锁的方法。然后线程共享此状态-它们都可以访问该内存,可以读取,重写,等等。但是您可以在线程模型之上构建actor模型,并且实际上所有actor实现都具有线程下。我通过给每个线程分配一个由互斥锁保护的队列(非常糟糕)来破解这样的东西(非常糟糕),这只是为了好玩。要了解如何管理主线程阻抗,请看我一年前的问题

我可以通过不同地使用线程来以任何语言使用Actor模型吗?

是的,但是还需要更多工作。您喜欢的语言很可能具有消息传递库,因此这将是第一个要研究的内容。另外,您应该研究不可变数据结构的使用。请注意,如果数据结构是不可变的,那么您实质上已经解决了“共享状态”问题-多个线程可以保存对不可变数据的引用,而不会发生任何不良情况。演员语言也倾向于是功能性语言(erlang,scala)是有原因的。

您可能还想看看软件事务存储,这是一个既不同但又引人注目的模型。Clojure是我最喜欢的例子。


3
我越使用基于异步消息传递的并发模型(例如actor或async / await),我就认为它们只是旧的标准同步阻塞并发模型的对偶。与使用锁和监视器相比,异步消息传递实际上并没有更轻松或更难。实际上,没有共享的可变状态,而仅在单个参与者级别。但是演员仍然具有可变的状态,并且与之合作的所有演员实际上都可以观察到该状态。死锁,活锁,饥饿,竞争条件等:因此,你可以拥有所有同样的问题
彼得·Kołaczkowski

2

我不会说参与者总是异步传递消息-这太慢了。例如,Jactor项目使用2向消息(请求/响应)来更好地对方法调用进行建模。并且大多数请求是同步服务的。

JActor(Java库)也不使用锁。只有一些原子和并发的数据结构,并带有一些信号量。消息传递每秒大约有88亿条消息。

https://github.com/laforge49/JActor


2
仅通过使用异步通信(en.wikipedia.org/wiki/Actor_model)定义actor模型。如果JActor不这样做,那不是100%仅是actor模型。它可能只是简单地将actor模型用作其功能的多个。
英国电信
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.