我对 Actor 模型还很陌生,这就是为什么我认为已经有一些既定的模式可以通过诸如 Actor 和 future 等美丽的可组合抽象来解决我的常见场景。
我的异步操作具有以下要求:
- 他们使用旧系统,发送低级请求,然后通过轮询监控实体的状态。因此,实际操作的结果只能以延迟的方式获得,当观察到的状态达到所需状态时,必须通知请求者。
- 这些操作只有在其他一些操作完成后才能发出,并且它们应该并行等待。
- 操作可以取消。当然,已经发出的低级请求无法撤消;取消意味着在我们依赖的操作完成后不发出实际操作,当然这必须递归传播(如果我们等待依赖项,并且它有多个挂起的操作,则不要发出它们)。里>
我在思考 future :第一个要求可以通过例如来解决阿卡的map
/flatMap
,第二个是 traverse
组合器无需在程序上维护依赖项/依赖项。但我想不出取消的解决方案; futures 不能被取消,如果组合,它们的组件也无法访问。如何以函数式方式封装“取消当前操作”? Scala 的 Actor 框架是否支持此功能?
最佳答案
创建一个使用监听器将轮询状态传播到所有监听器的 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/