Jon*_*nas 86 concurrency multithreading message-passing actor
对于线程与线程相比,Actors的工作方式是否有任何好的和简短的解释?
一个线程不能被视为一个actor并将消息发送到其他线程吗?我看到了一些不同,但对我来说并不是那么清楚.我可以通过不同的线程使用任何语言的Actors吗?
Rob*_*lan 76
actor模型对消息传递进行操作.允许各个进程(参与者)彼此异步发送消息.这与我们通常认为的线程模型的区别在于(理论上至少)没有共享状态.如果有人相信(我认为合理的话)共享状态是所有邪恶的根源,那么演员模型就变得非常有吸引力.
但是,我们不应该过度兴奋.演员模型没有(与某些指控相反)使得无法陷入僵局.actor模型也不会阻止您在不同进程(例如,消息队列)之间争用资源.该模型仅在某个级别之上"无锁".在较低级别,为了协调消息队列,仍然需要锁定.
一个线程不能被视为一个actor并将消息发送到其他线程吗?
嗯,是的,不.不,如果您只是使用将互斥锁放在共享内存位置的方法.然后线程共享这种状态-他们都可以访问该存储器,可以同时读取它,重新写,等等,但你可以建立一个线程模型之上的角色模型,以及所有演员的实施确实有螺纹下.我通过给每个线程一个由互斥锁保护的队列来攻击这样的东西(非常糟糕) - 只是为了好玩.要了解演员线程阻抗的管理方式,请参阅一年前的问题.
我可以通过不同的线程使用任何语言的Actor模型吗?
是的,但这需要更多的工作.您最喜欢的语言可能有一个消息传递库,因此这是首先要调查的内容.此外,您应该研究不可变数据结构的使用.请注意,如果数据结构是不可变的,那么您基本上处理了"共享状态"问题 - 多个线程可以保存对不可变数据的引用,而不会发生任何不良事件.演员语言往往也是函数式语言(erlang,scala)是有原因的.
您可能还想查看软件事务内存,这是一个不同但也很引人注目的模型.Clojure是我最喜欢的例子.