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

Jon*_*nas 86 concurrency multithreading message-passing actor

对于线程与线程相比,Actors的工作方式是否有任何好的和简短的解释?

一个线程不能被视为一个actor并将消息发送到其他线程吗?我看到了一些不同,但对我来说并不是那么清楚.我可以通过不同的线程使用任何语言的Actors吗?

Rob*_*lan 76

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

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

一个线程不能被视为一个actor并将消息发送到其他线程吗?

嗯,是的,不.不,如果您只是使用将互斥锁放在共享内存位置的方法.然后线程共享这种状态-他们都可以访问该存储器,可以同时读取它,重新写,等等,但你可以建立一个线程模型之上的角色模型,以及所有演员的实施确实有螺纹下.我通过给每个线程一个由互斥锁保护的队列来攻击这样的东西(非常糟糕) - 只是为了好玩.要了解演员线程阻抗的管理方式,请参阅一年前的问题.

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

是的,但这需要更多的工作.您最喜欢的语言可能有一个消息传递库,因此这是首先要调查的内容.此外,您应该研究不可变数据结构的使用.请注意,如果数据结构是不可变的,那么您基本上处理了"共享状态"问题 - 多个线程可以保存对不可变数据的引用,而不会发生任何不良事件.演员语言往往也是函数式语言(erlang,scala)是有原因的.

您可能还想查看软件事务内存,这是一个不同但也很引人注目的模型.Clojure是我最喜欢的例子.

  • 我使用基于异步消息传递的并发模型(例如actor或async/await)越多,我就越认为它们只是旧的标准同步阻塞并发模型的双重性.异步消息传递实际上并不比使用锁和监视器更容易或更难.实际上,没有共享的可变状态,但仅在*单个演员级别*.但是演员仍然具有可变状态,并且所有与之合作的演员实际上都可以观察到它.因此,您可以遇到所有相同的问题:死锁,活锁,饥饿,竞争条件等. (3认同)