如何处理Scala / Akka中的无限未来?

时间:2015-03-30 14:16:13

标签: multithreading scala akka

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

我“解决了”像这样的问题

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

因此我的代码不会永远阻止。但是,我开始通过使用简单makeSomeCall()Thread.sleep()进行存根来测试这一点,并发现Await.result实际上并未杀死未来,因为测试执行会继续1.minute左右,并且使用此参数进行更改。 我调试了一下,发现实际上,Await.result返回,但是线程在后台继续,等待Thread.sleep完成。

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

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

2 个答案:

答案 0 :(得分:2)

我认为你认为Await.result没有“杀死”未来是正确的。 await限制等待代码等待的时间,它不会限制提供未来结果的代码。

这一般不合理,因为程序中可能有许多地方等待同一个未来的结果。

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

答案 1 :(得分:2)

可能你应该看看CancellableFutures或InterruptibleFutures的实现。 这是来自VictorKlang的gist,带有实现