当前位置: 首页 > 知识库问答 >
问题:

Akka Gotchas在处理期货时

周高畅
2023-03-14

考虑以下代码位:

def receive = {
  case ComputeResult(itemId: Long) =>
    //val originalSender = sender
    computeResult(itemId).map { result =>
      originalSender ! result
    }
}

计算机结果将在未来产生,那么val的引入将如何防止我将结果发送给错误的发件人?假设我有一个完全不同的发送者(发送者1和发送者2)。

Sender1 首先发送一条消息,然后发送 Sender2。如果没有上述方法中的 val,我清楚地看到我的 Sender2 有可能获得实际上针对 Sender1 的结果。

我不明白的是,val的引入将如何阻止我刚才描述的场景?

共有1个答案

刘瑞
2023-03-14

sender实际上是一个函数(这就是为什么从Akka 2.3开始的约定是编写sender())。通过将值绑定到原始Sender,我们可以关闭该不可变值并知道它不会改变,即使在Future from完成结果完成之前有另一条消息进来。

因为 receive 是一个函数,所以每次调用都会产生一个名为 originalSender 的新本地值。

 类似资料:
  • 我正在与我无法控制的遗留库集成。 它定义了以下接口: 这个“subscribe”方法被不同的线程频繁调用。我关心“Future.get()”的结果的唯一情况是当它失败时,所以我可以获取并处理异常。这不一定发生在调用线程中。另外,在“Future.get()”上阻塞调用线程对我来说是非常昂贵的,因为即使成功也可能需要几秒钟才能完成。 所以我的任务是以某种方式“后处理”所有这些期货,过滤失败的期货。基

  • 我有一个基于喷雾的HTTP服务。我有一个在这个HTTP应用程序内部运行的流。现在由于这个流要做大量的I/O,所以我决定使用一个单独的线程池。我查阅了Akka文档,看看我可以做些什么来使我的线程池是可配置的。我在Akka遇到了调度器的概念。所以我尝试在application.conf中使用它如下所示: 在我的执行元中,我尝试将此配置查找为: 当我运行我的服务时,我得到以下错误:

  • 我是Scala未来的新手,我还没有找到问题的解决方案。我正在努力实现以下目标(总体描述:努力获取一个酒店列表的客人列表,分别查询每个酒店): < li >对另一个API进行n次调用,每次调用都超时 < li >合并所有结果(将列表转换为包含所有元素的列表) < li >如果单个调用失败,记录错误并返回一个空列表(本质上,在这种情况下,如果我得到部分结果总比没有结果好) < li >理想情况下,如果

  • 假设我有一个抽象的“生产者”实例: 我需要对它产生的每个(或一些)对象进行一些处理。所以,我做了类似的事情: …并以<code>Future[Seq[Future[T]]]结束。这没关系,但有点麻烦。我想摆脱外部的,只需要就可以了,但我想不出一个(非阻塞)转换,可以让我这样做。 有什么想法吗?

  • 我想创建一个函数来返回成功操作的一系列期货的结果。我遇到的问题是返回类型为Unit,并且未来函数正在完成,而无需等待嵌套的未来序列完成。我尝试过不使用on完成函数,而是使用map或平面图,但没有成功。我还想避免使用wait 这个后来会这么叫

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 如果我们可以通过几个后期处理(Postprocess)特效丰富Breakout游戏的视觉效果的话,会不会是一件很有趣的事情?利用OpenGL的帧缓冲,我们可以相对容易地创造出模糊的抖动效果、反转场景里的所有颜色、做一些“疯狂”的顶点运动、或是使用一些其他有趣的特效。 Imp