期货非常方便,但在实践中,您可能需要对其执行提供一些保证。 例如,考虑:

import scala.actors.Futures._

def slowFn(time:Int) = {
    Thread.sleep(time * 1000)
    println("%d second fn done".format(time))
}

val fs = List( future(slowFn(2)), future(slowFn(10)) )
awaitAll(5000, fs:_*)
println("5 second expiration. Continuing.")

Thread.sleep(12000)      // ie more calculations
println("done with everything")

我们的想法是并行启动一些慢速运行的功能。 但是如果期货执行的函数没有返回,我们就不想永远挂起。 所以我们使用awaitAll()来对期货进行超时。 但是如果您运行代码,您会看到5秒计时器到期,但10秒未来继续运行并稍后返回。 超时不会杀死未来; 它只是限制了连接等待。

那么你如何在超时后杀死未来? 似乎期货不能在实践中使用,除非您确定它们将在已知的时间内返回。 否则,您将冒险将线程池中的线程丢失到非终止期货,直到没有剩余。

所以问题是:你如何杀死未来? 鉴于这些风险,期货的预期使用模式是什么?

#1楼 票数:2

期货旨在用于您需要等待计算完成的设置,无论如何。 这就是他们被描述为用于慢速运行功能的原因 你想要这个功能的结果,但你可以同时做其他的事情。 事实上,你可能有许多期货,你们可能想要并行运行,而你们要等到所有期货都完成。

计时器只是等待获得部分结果。

#2楼 票数:1

我认为Future不能简单地被“杀死”的原因与java.lang.Thread.stop()被弃用的原因完全相同。

在Future运行时,需要一个Thread。 为了在不执行Thread的情况下调用stop()来停止Future,需要特定于应用程序的逻辑:定期检查应用程序特定标志或执行线程的中断状态是一种方法。

  ask by DrGary translate from so

未解决问题?本站智能推荐:

1回复

在Scala的期货中使用期货的方法

我需要同时执行数千个任务。 所以我正在考虑为此目的使用期货。 但是这数千个任务中的每一个都已经在未来。 在未来中使用未来会很好。 或者我在这里做错了。 每个任务大约需要1毫秒的时间来计算。 因此,我认为最好不要在期货交易中按顺序进行。 因此,从理论上讲,完成整个任务大约需要1毫秒左
1回复

在Scala中使用期货吗?

我正在尝试将数据库合并到我的http-微服务中。 微服务具有函数getValueFromInternet(val: Foo): Future[Value] ,我的微服务在GET请求中调用了该函数。 现在,我希望发生这种情况,以便函数getValue(val: Foo): Future[V
2回复

在Akka直接使用期货

我无法按照此处的说明创建未来。 它表示您可以使用以下代码直接创建Future : 使用完全相同的代码,我得到一个error: could not find implicit value for parameter executor: akka.dispatch.ExecutionCon
3回复

如果不使用期货,为什么期货会被理解?

我正在尝试实现一个将请求缓存到外部API的系统。 如果响应在缓存中,则不应向外部站点发出请求。 我有两种方法: 然后我尝试执行以下操作: 这是有效的,但是对外部API的请求始终是,即使返回缓存的结果也是如此。 这显然不是我想要的,因为它很慢。 我该如何解决?
1回复

Scala:合并使用期货超时的排序

下面的顺序合并排序可以非常快速地返回结果: 但是,当我尝试使用Future对其进行并行化时,它超时了:- 我收到超时异常。 我知道这可能是因为此代码产生了log2 10000个线程,这增加了很多延迟,因为执行上下文线程池可能没有那么多线程。 1.)如何在合并排序和代码并行
1回复

使用期货时程序不会终止

我正在尝试对目录中的每个文件同时运行一个函数。 可悲的是,每当我使用 Futures 时,我的程序都不想终止(永远运行)。 我试过使用Await.result()得到相同的结果:/ 运行代码时它执行得很好,甚至“完成?” 被打印,然后它挂起...... 继承人我的代码。 (我是 Scala 的
1回复

如何在 Kafka Streams 中使用 Futures

在 Scala 中使用org.apache.kafka.streams.KafkaStreams库时,我一直在尝试读取 inputStream,将该信息传递给一个方法: validateAll(infoToValidate)返回一个 Future,解析它,然后发送到输出流。 例子: 是否有任何
2回复

使用期货和Thread.sleep

通过执行此scala代码,我在控制台中没有任何输出。 (我真的不明白发生了什么) 如果我删除Console.println("Console.println OK!") =>一切似乎都很好。 如果我删除Thread.sleep(2000) =>一切似乎都很好。 你