til*_*ish 41 concurrency multithreading functional-programming actor-model actor
应该何时使用Actor模型?
它当然不能保证无死锁的环境.
B等待A时,Actor A可以等待来自B的消息.
此外,如果演员在进入下一个任务之前必须确保其消息已被处理,则必须发送消息并等待"您的消息已被处理"消息而不是直接阻止.
模特的力量是什么?
Ric*_*ick 24
鉴于一些并发问题,您会决定是否使用演员?
首先,我将寻找定义问题...是嵌套for循环或递归的加速的主要动机?如果是这样,一个简单的基于任务的方法或并行循环方法可能适合你(而不是演员).
但是,如果您有一个涉及依赖关系和协调共享状态的更复杂的系统,那么actor方法可以提供帮助.特别是通过使用actor和消息传递语义,您通常可以通过实际制作该状态(消息)的副本并对它们做出反应来避免使用显式锁来保护共享状态.
您可以通过餐饮哲学家和睡眠理发师问题等经典同步问题轻松完成这项工作.但是你也可以使用'actor'来帮助更现代的模式,即你的门面可以是一个演员,你的模型视图和控制器也可以是相互沟通的演员.
我观察到的另一件事是,大多数开发人员都可以学习演员语义,并且比他们的锁定对手更"安全".这是因为它们提高了抽象级别,并允许您专注于协调对该数据的访问,而不是使用锁保护对数据的所有访问.举个例子,假设你有一个带有数据成员的简单类.如果您选择在该类中放置一个锁来保护对该数据成员的访问,那么该类上的任何方法都需要确保它们正在锁定下访问该数据成员.当其他人(或您)在以后修改该类时,这尤其成问题,他们必须记住使用该锁.
另一方面,如果该类成为一个actor并且数据成员成为通过消息进行通信的缓冲区或端口,则不必记住采用锁定,因为语义内置于缓冲区中,您将非常明确地知道是否要根据缓冲区的类型阻止它.
-Rick
par*_*tic 19
在至少两种情况下,Actor的使用是"自然的":
例如,如果使用一系列过滤器处理复杂数据,则很容易使用actor的管道,其中每个actor从上游actor接收数据并将数据设置为下游actor.
当然,这个数据流不能是线性的,如果你的管道中的一个步骤很慢,你可以使用一个扮演相同工作的演员池.解决负载平衡问题的另一种方法是使用由一种虚拟看板系统组织的需求驱动方法.
当然,在几乎所有有趣的情况下,你都需要演员之间的同步,但与经典的多线程方法相反,这种同步真的是"具体的".您可以想象工厂里的人,想象可能存在的问题(工作人员要做的工作,上游操作太快,中间产品需要大量存储空间等).通过类比,您可以更容易地找到解决方案.