替代Akka以顺序处理任务

时间:2017-04-02 19:40:46

标签: multithreading scala concurrency akka

我有一个系统可能会在事务的生命周期中生成某些事件。在每一个甚至我都需要更新数据库中的行,并通过websocket发送一个UI事件。

我有一个选项是在actor中实现事件处理(DB和UI),从而避免任何锁定问题 - 我也可以承受轻微的延迟,因此按顺序处理这将大大简化问题。

在Scala处理此问题的替代方法是什么,因为我觉得在这种情况下演员可能有点矫枉过正? 有些博客声称演员应该用于“与州并发” - 尽管我希望看到更合适的机制来消除这种选择。

3 个答案:

答案 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实现可能看起来模糊不清。