gpt4 book ai didi

scala - 如何在没有 Akka 的情况下实现 Actor 模型?

转载 作者:行者123 更新时间:2023-12-03 23:19:21 25 4
gpt4 key购买 nike

如何在没有 Akka 的情况下实现简单的 Actor?对于许多(非固定计数)actor 实例、绿色线程、IoC(生命周期、基于 Props 的工厂、ActorRef 的)、监督、背压等,我不需要高性能。只需要顺序性(队列)+ 处理程序 + 状态+ 消息传递。

作为副作用,我实际上需要基于actor的小型管道(带有递归链接)+一些并行actor来优化DSP算法计算。它将在没有传递依赖的库中,所以我不想(也不能因为它是一个 jar 插件)插入用户创建和传递 akkaSystem ,该库应具有尽可能简单和轻量级的界面。我不需要 IoC,因为它只是一个库(一组函数),而不是一个框架——因此它的算法复杂性比结构复杂。但是,我认为 Actor 是描述协议(protocol)的好工具,实际上我可以将算法分解为少量异步交互的实体,因此它符合我的需求。

为什么不是 Akka

Akka 很重,这意味着:

  • 这是一个外部依赖;
  • 具有复杂的接口(interface)和实现;
  • 对库的用户不透明,例如 - 所有实例都由 akka 的 IoC 管理,因此不能保证一个逻辑参与者总是由同一个实例维护,重启将创建一个新实例;
  • 需要额外的迁移支持,这与 scala 的迁移支持本身相当。
  • 使用 jstack 调试 akka 的绿色线程也可能更难。/jconsole/jvisualvm ,因为一个actor可以作用于任何线程。

  • 当然,Akka 的 jar (1.9Mb) 和内存消耗(每 GB 250 万 Actor )一点也不重,所以你甚至可以在 Android 上运行它。但众所周知,您应该使用专门的工具来观察和分析 Actor (如 Typesafe Activator/Console),用户可能不熟悉(我不会强制他们学习)。对于企业项目来说一切都很好,因为它几乎总是有 IoC、一些专门的工具和持续迁移,但这对于一个简单的库来说不是一个好方法。

    附言关于依赖。我没有它们,我不想添加任何东西(我什至避免使用 scalaz,它实际上有点适合这里),因为它会导致大量维护 - 我必须保留我的简单库与 Akka 保持同步。

    最佳答案

    这是 JVM 世界中最小且最高效的 actor,其 API 基于 Viktor Klang 的 Minimalist Scala actor:
    https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/src/test/scala/com/github/gist/viktorklang/Actor.scala

    它使用起来方便且安全,但在接收消息时类型不安全,并且无法在进程或主机之间发送消息。

    主要特点:

  • 最简单的类似 FSM 的 API,只有 3 个状态(StayBecomeDie):https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/src/test/scala/com/github/gist/viktorklang/Actor.scala#L28-L30
  • 极简错误处理 - 正确转发到执行线程的默认异常处理程序:https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/src/test/scala/com/github/gist/viktorklang/Actor.scala#L52-L53
  • 快速异步初始化大约需要 200 ns 才能完成,因此不需要额外的 future / Actor 来进行耗时的 Actor 初始化:https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/out0.txt#L447
  • 最小的内存占用,即被动状态下约 40 个字节(顺便说一句,new String() 在 JVM 堆中花费相同数量的字节):https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/out0.txt#L449
  • 消息处理非常高效,4 核 CPU 的吞吐量约为 90M msg/sec:https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/out0.txt#L466
  • 消息发送/接收非常高效,延迟约 100 ns:https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/out0.txt#L472
  • 每个参与者通过批处理参数调整公平性:https://github.com/plokhotnyuk/actors/blob/41eea0277530f86e4f9557b451c7e34345557ce3/src/test/scala/com/github/gist/viktorklang/Actor.scala#L32

  • 有状态计数器示例:
      def process(self: Address, msg: Any, state: Int): Effect = if (state > 0) { 
    println(msg + " " + state)
    self ! msg
    Become { msg =>
    process(self, msg, state - 1)
    }
    } else Die

    val actor = Actor(self => msg => process(self, msg, 5))

    结果:
    scala> actor ! "a"
    a 5

    scala> a 4
    a 3
    a 2
    a 1

    关于scala - 如何在没有 Akka 的情况下实现 Actor 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27657970/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com