我有一个系统可能会在事务的生命周期中生成某些事件。在每一个甚至我都需要更新数据库中的行,并通过websocket发送一个UI事件。
我有一个选项是在actor中实现事件处理(DB和UI),从而避免任何锁定问题 - 我也可以承受轻微的延迟,因此按顺序处理这将大大简化问题。
在Scala处理此问题的替代方法是什么,因为我觉得在这种情况下演员可能有点矫枉过正? 有些博客声称演员应该用于“与州并发” - 尽管我希望看到更合适的机制来消除这种选择。
答案 0 :(得分:0)
最终使用actor的主要独特好处是它们非常适合封装可变变量,以便您避免竞争条件。
要做你所描述的,你可以使用经典线程。在您(可能简化的)描述中,我没有看到死锁的可能性。如果你想要更具组合性的东西,例如一系列异步任务,您可以使用Scala的Future
s。
答案 1 :(得分:0)
完全不确定这是否适用于Scala,但是Groovy和Java有一个很好的lib,它有几个并发模型。我自己使用Dataflow Concurrency取得了巨大的成功,可以推荐它作为轻量级但易于管理的模型。
Dataflow Concurrency提供了另一种并发模型,即 本质安全和强大。它强调数据及其数据 通过您的流程而不是实际流程流动 操纵数据。数据流算法减轻了开发人员的负担 处理活锁,竞争条件和死锁 确定性,因此100%可重复。如果你没有死锁 在测试中,你不会将它们投入生产。
链接的GPars
库中还有其他模型。
除非您没有其他选择,否则我不建议您自己制作线程。
<强>附录强>
发帖后我对这个主题感兴趣并进行了一些搜索。似乎也是Akka has direct support for Dataflow model。或至少在某个版本中有过。
答案 2 :(得分:0)
Actors避免锁定问题,因为它们使用队列进行交互。您可以使用具有(阻塞)队列的线程并获得相同的安全级别。 Actors over Threads的唯一优势是Actor不会为调用堆栈花费内存,因此我们可以拥有比相同数量的核心内存中的线程更多的actor。 actor模型的缺点是可以在单个线程中实现的复杂算法需要多个actor,因此actor实现可能看起来模糊不清。