Actors与线程相比如何工作?

有什么好的和简短的解释演员如何工作相比线程?

一个线程不能被视为一个演员,并发送消息到其他线程? 我看到有些不同,但对我来说不是很清楚。 我可以通过不同的线程使用任何语言的Actor吗?

演员模型运行消息传递。 各个进程(参与者)被允许相互asynchronous地发送消息。 与我们通常认为的线程模型区别的是,至less在理论上(至less)没有共享状态。 如果有人相信(有理由,我认为)共享状态是万恶的根源,那么演员模型就会变得非常有吸引力。

不过,我们不应该过度兴奋。 演员模型不(与一些指控相反)使得不可能存在僵局。 参与者模型也不会阻止您在不同进程之间争用资源 – 例如消息队列。 该模型只是在一定水平之上“无锁”。 在较低级别上,为了协调消息队列,仍然需要locking。

一个线程不能被视为一个演员,并发送消息到其他线程?

那么,是的,不。 不,如果您只是使用在共享内存位置周围放置互斥锁的方法。 然后这些线程共享这个状态 – 他们都可以访问这个内存,既可以读取它,也可以重写它,等等。但是你可以在线程模型之上build立一个actor模型,而且所有的actor实现都有线程下。 我通过给每个线程一个由互斥量守护的队列一起黑客攻击(非常糟糕) – 只是为了好玩。 想了解演员线程阻抗如何pipe理,请参阅一年前的问题 。

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

是的,但需要更多的工作。 你最喜欢的语言可能有一个消息传递库,所以这将是第一个要调查。 另外,您应该研究不可变数据结构的使用。 注意,如果一个数据结构是不可变的,那么你基本上已经处理了“共享状态”问题 – 多个线程可以保存对不可变数据的引用,而不会发生任何错误。 演员语言也倾向于是function语言(erlang,scala)。

您可能还想看看Software Transactional Memory,这是一个不同但也是引人注目的模型。 Clojure是我最喜欢的例子。

我不会说演员总是asynchronous地传递消息 – 这太慢了。 例如,JActor项目使用双向消息(请求/响应)来更好地build模方法调用。 而且大多数请求是同步服务的。

JActor(一个Java库)也不使用锁。 只有一些primefaces和并发的数据结构,并引入less量信号。消息传递每秒大约有80亿条消息。

https://github.com/laforge49/JActor