与线程相比,Actor的工作原理有什么好的简短的解释?
线程不能被视为参与者并向其他线程发送消息吗?我看到了一些区别,但是对我来说还不清楚。我可以通过不同地使用线程来以任何语言使用Actor吗?
Answers:
角色模型对消息传递进行操作。允许各个进程(演员)彼此异步发送消息。这与我们通常认为的线程模型的区别在于,(至少在理论上)没有共享状态。而且,如果有人(合理地,我认为)认为共享状态是所有邪恶的根源,那么参与者模型就变得非常有吸引力。
但是,我们不应该过分兴奋。演员模型不会(与某些指控相反)使不可能陷入僵局。actor模型也不会阻止您争用不同进程之间的资源,例如消息队列。该模型仅在特定级别以上是“无锁的”。在较低级别上,为了协调消息队列,仍然需要锁定。
线程不能被视为参与者并向其他线程发送消息吗?
好吧,是的,不是。不,如果您只是使用在共享内存位置周围放置互斥锁的方法。然后线程共享此状态-它们都可以访问该内存,可以读取,重写,等等。但是您可以在线程模型之上构建actor模型,并且实际上所有actor实现都具有线程下。我通过给每个线程分配一个由互斥锁保护的队列(非常糟糕)来破解这样的东西(非常糟糕),这只是为了好玩。要了解如何管理主线程阻抗,请看我一年前的问题。
我可以通过不同地使用线程来以任何语言使用Actor模型吗?
是的,但是还需要更多工作。您喜欢的语言很可能具有消息传递库,因此这将是第一个要研究的内容。另外,您应该研究不可变数据结构的使用。请注意,如果数据结构是不可变的,那么您实质上已经解决了“共享状态”问题-多个线程可以保存对不可变数据的引用,而不会发生任何不良情况。演员语言也倾向于是功能性语言(erlang,scala)是有原因的。
您可能还想看看软件事务存储,这是一个既不同但又引人注目的模型。Clojure是我最喜欢的例子。
我不会说参与者总是异步传递消息-这太慢了。例如,Jactor项目使用2向消息(请求/响应)来更好地对方法调用进行建模。并且大多数请求是同步服务的。
JActor(Java库)也不使用锁。只有一些原子和并发的数据结构,并带有一些信号量。消息传递每秒大约有88亿条消息。