【问题标题】:In Scala how to make a thread wait for a future results to be ready?在 Scala 中,如何让线程等待未来的结果准备好?
【发布时间】:2015-07-14 11:16:55
【问题描述】:

我有一个回调处理程序,它处理 URL 处理的多个阶段之一。在这个处理程序中,我必须使用第三方库(scala 接口)并计算一些将设置一个全局配置的值。此配置由以下阶段使用,它在回调处理程序中获得的值起着至关重要的作用。

这是设计的外观

def callbackHandler() : someReturnType = {
    val myFut = getMyData() // return a future
    myFut map {m => set_global} // evaluate the future
    someReturnTypeObject
}

在这种情况下,这是我的问题。我正在使用的 Scala API 向我返回了一个未来,我使用“地图”对其进行评估。据我了解,在获得未来实例后,回调函数将继续处理待处理的内容,并且未来将在可用时进行评估(在单独的线程中)。

在这种情况下,我将如何确保让回调处理程序等待未来的评估?

将第 4 行移动到地图主体可能不起作用,因为如果地图需要时间,回调处理程序可能仍会提前返回。如果您有任何问题,或者我的理解有误,请告诉我。

【问题讨论】:

  • 正如下面评论的那样,虽然您可以阻止您确实不应该阻止,但您的问题可能会更好地改写为您应该如何设计系统而不需要阻止未来

标签: scala functional-programming future


【解决方案1】:

使用Future 的目的是不阻塞线程。理想情况下,您应该在完成未来的过程中执行您想要的代码,而不是阻塞未来并在同一个线程上恢复。

也就是说,阻塞未来的机制是:

val result = Await.result(myFut, 10.seconds)

10.seconds 是您愿意等待的最长时间。

您还应该注意map 不会评估未来。只要您致电getMyData,评估就会开始。 map 所做的只是将未来的结果转换为未来,一旦结果可用。

【讨论】:

  • 感谢您的回答...在这种情况下,我只能控制我在处理程序中编写的内容。这些阶段和 scala 接口是预先存在的并且已经使用了相当长的一段时间。我真的不能改变它们,或者去其他的选择。关于“而不是阻止未来并在同一个线程上恢复”,我如何在不等待回调处理程序的情况下做到这一点?我的意思是当它退出的那一刻我失去了对进程的控制,所以我必须随身携带它并处理未来。如果我做对了,请告诉我。
  • 如果没有看到更多的消费系统,就很难知道如何避免阻塞,而且确实,一旦你开始异步,它通常是一个一直向下同步设想。 IE。任何调用返回未来的东西,都需要返回未来本身,依此类推。这就是为什么越来越多的 Web 框架支持异步请求处理程序的原因,以便可以通过未来的 onComplete 提供响应,而不必阻塞请求线程。
  • 感谢您的建议,我现在更好地理解了这个想法,并会尝试进行相应的修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2011-07-10
  • 2021-04-26
相关资源
最近更新 更多