Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何处理Scala/Akka中的无限未来?_Multithreading_Scala_Akka - Fatal编程技术网

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

Multithreading 如何处理Scala/Akka中的无限未来?,multithreading,scala,akka,Multithreading,Scala,Akka,我的问题是——我使用Scala和Akka——其中一项工作是通过第三方SDK使用外部API。问题是我无法控制这个SDK,而且,我应该期望在里面发生任何事情,甚至无限循环 我像这样“解决”了这个问题 Await.result( Future { sdk.makeSomeCall()}, 1.minute) 所以我的代码不会永远阻塞。然而,我开始通过使用simpleThread.sleep(),stubingmakeSomeCall()来测试这一点,并发现wait.result实际上并不会扼杀未来,

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

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

Await.result( Future { sdk.makeSomeCall()}, 1.minute)
所以我的代码不会永远阻塞。然而,我开始通过使用simple
Thread.sleep()
,stubing
makeSomeCall()
来测试这一点,并发现
wait.result
实际上并不会扼杀未来,因为测试执行会持续大约
1.min
,并随此参数变化。 我进行了一点调试,发现实际上,
wait.result
返回,但是线程在后台继续,等待
Thread.sleep
完成

我假设我的代码只是从当前的未来“分离”出来,让它在给定的线程中执行——这可能会很快导致生产代码中的一些不足


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

我认为您的假设是正确的,即
等待。result
不会“杀死”未来。
wait
限制了等待代码的等待时间,它根本不限制为未来提供结果的代码

这在总体上是不合理的,因为项目中可能有许多地方在等待同一个未来的结果


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

可能您应该考虑CancelableFutures或InterruptableFutures的实现。
下面是VictorKlang提供的一个实现

我不知道是否正确回答了您的问题,但是您可以在代码的其余部分之后等待结果,不是吗?请参见