【问题标题】:How to deal with infinite Future in Scala/Akka?如何处理 Scala/Akka 中的无限未来?
【发布时间】:2015-04-02 18:17:06
【问题描述】:

我的问题是 - 我使用 Scala 和 Akka - 其中一项工作是通过第三方 SDK 使用外部 API。问题是我无法控制这个 SDK,而且,我应该预料到里面会发生任何事情,甚至是无限循环。

我这样“解决”了这个问题

Await.result( Future { sdk.makeSomeCall()}, 1.minute)

所以我的代码不会永远阻塞。然而,我开始通过简单的Thread.sleep()makeSomeCall() 进行存根测试,发现Await.result 实际上并没有杀死未来,因为测试执行持续了大约1.minute 并随着这个参数而改变。 我调试了一下发现,实际上,Await.result 返回了,但是线程在后台继续,等待Thread.sleep 完成。

我假设我的代码只是从当前的 Future 中“分离”并让它在给定的线程中执行 - 这可能很快导致生产代码中的一些饥饿。

问题很简单 - 如何使其正确 - 这意味着在超时后新线程/Future 将被终止,并且此代码分配的所有资源都将被释放(我假设 SDK 可能会造成一些混乱,但这现在不是问题)

【问题讨论】:

标签: multithreading scala akka


【解决方案1】:

我认为你的假设是正确的,Await.result 不会“扼杀”未来。 await 限制了等待代码等待的时间,它根本不限制为未来提供结果的代码。

这通常是不合理的,因为程序中可能有很多地方在等待相同未来的结果。

您可以做的是在一个线程中启动第 3 方代码并等待线程在一个时间限制内完成。如果线程未在分配的时间内完成,则您将终止该线程。您可以将此逻辑包装到 Promise 中,并在第 3 方代码按时完成时返回成功,或者在您必须终止线程时返回超时失败。

【讨论】:

    【解决方案2】:

    您可能应该考虑实现 CancelableFutures 或 InterruptibleFutures。 这是来自 VictorKlang 的 gist 的实现

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      相关资源
      最近更新 更多