【问题标题】:Ask pattern which doesn't wait after result询问结果后不等待的模式
【发布时间】:2020-08-21 17:21:37
【问题描述】:

我有一个 akka actor,它按顺序做一些事情,可以这样总结:

def receive = {
    case Request(...) => {
        val id = generatedId()
        sender() ! id
        doSomeOtherStuffs()
    }
}

使用一些ask模式调用actor

val id = myActor ? Request(...)

这里的问题是调用我的演员的代码正在等待所有 doSomeOtherStuffs() 事情完成。

让演员回复然后让调用代码停止等待该演员的正确方法是什么?

【问题讨论】:

  • 我不认为客户端(特别是ask/? 调用)应该等待doSomeOtherStuffs() 完成,它应该能够继续(即未来应该完成)一旦获得id。你能发布一个更完整的例子吗?
  • 我不是 akka 方面的专家,但我想如果你有自定义线程池配置并且池中只有一个线程可用,那么可能会发生这种情况。
  • 为什么你希望发件人等待来自 doSomeOtherStuffs() 的结果,而你已经向他们发送了 id? 1. 因为你发回了id,所以发件人不会再等了。这与您编写的代码相对应是正确的。 2. 如果那真的是你想要的。为什么不只在 doSomeOtherStuffs() 完成其工作后将 id 发回给发件人?

标签: scala playframework akka actor


【解决方案1】:

这个怎么样?将其他内容的实际执行与响应请求解耦

def receive = {
    case Request(...) => {
        val id = generatedId()
        sender() ! id
        self ! DoSomethingElse(...)
    }
    case DoSomethingElse(...) =>
        doSomethingElse()
}

【讨论】:

    猜你喜欢
    • 2017-10-30
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多