gpt4 book ai didi

future - 如何与参与者实现异步相互依赖的可取消操作?

转载 作者:行者123 更新时间:2023-12-04 06:15:54 25 4
gpt4 key购买 nike

我对 Actor 模型很陌生,这就是为什么我认为已经建立了一些模式来解决我看起来很普通的场景,其中包含诸如 Actor 和 Future 之类的漂亮的可组合抽象。

我有具有以下要求的异步操作:

  • 他们通过发送低级请求然后通过轮询监视实体的状态来使用遗留系统。所以实际操作的结果只能以延迟的方式获得,当观察到的状态达到期望的状态时,必须通知请求者。
  • 这些操作只有在其他一些操作完成后才能发出,它们应该并行等待。
  • 可以取消操作。当然,已经发出的低级请求是无法撤销的;取消意味着在我们依赖的操作完成后不发出实际操作,当然这必须递归传播(如果我们等待一个依赖项,并且它有多个挂起的操作,不要发出它们)。

  • 我在 Futures 中思考:第一个要求可以通过例如解决阿卡的 map/ flatMap ,第二个用 traverse组合器,而无需在程序上维护依赖项/依赖项。但我想不出取消的解决方案; future 不能取消,如果组合,则无法访问其组件。如何以函数方式封装“取消当前操作”? Scala 的任何 Actor 框架都支持这个吗?

    最佳答案

    使用监听器:https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/Listeners.scala

    制作一个使用监听器将轮询状态传播到任何和所有监听器的 Actor。然后您可以使用消息传递循环来重新启动轮询。

    class MyActor extends Actor with Listeners {

    override def preStart {
    self ! 'poll //Start looping on start
    }

    def receive = listenerManagement orElse {
    case 'poll => val result = pollYourExternalDude()
    gossip(result)
    self ! 'poll //Loop
    }
    }

    然后,您可以使用停止或发送 PoisonPill 来停止 actor。

    这有帮助吗?

    关于future - 如何与参与者实现异步相互依赖的可取消操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254925/

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