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

标签 future actor cancellation

我对 Actor 模型还很陌生,这就是为什么我认为已经有一些既定的模式可以通过诸如 Actor 和 future 等美丽的可组合抽象来解决我的常见场景。

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

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

我在思考 future :第一个要求可以通过例如来解决阿卡的map/flatMap ,第二个是 traverse组合器无需在程序上维护依赖项/依赖项。但我想不出取消的解决方案; futures 不能被取消,如果组合,它们的组件也无法访问。如何以函数式方式封装“取消当前操作”? 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
  }
}

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

这有帮助吗?

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

相关文章:

java - 如何将 Typesafe Akka 与 Node.js 结合使用

javascript - 使用 future 的javascript dom

python - 进程池执行器 : member variable lost in returned objects

c++ - pthread_once() 中的竞争条件?

ruby - 如何设计和构建使用Actor的程序

c# - 确保取消某些任务

c++ - 即使调用 get() , future 也不会运行

swift - 如何从 `actor` 的操作或 `Button` 引用 `Binding` 的属性?

c# - 创建LinkedTokenSource : How to avoid dead code

c# - 取消 ThreadPool .QueueUserWorkItem 任务