Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
在scala中混合使用异步库和同步代码的最佳实践是什么_Scala_Future - Fatal编程技术网

在scala中混合使用异步库和同步代码的最佳实践是什么

在scala中混合使用异步库和同步代码的最佳实践是什么,scala,future,Scala,Future,我正在处理一个scala代码,其中第三方库返回一个未来的[Boolean]对象,而我需要在我的scala代码中使用这个未来的对象,该代码完全以同步方式编写 目前,我正在对第三方lib操作执行wait.result,以确保它只返回布尔值。有没有更好的方法来处理这个问题,我的scala代码需要一个布尔值来进行进一步的操作?正如Luis在评论中指出的,一般来说,除了等待未来的之外,别无选择 也就是说,您可以选择在哪里等待 例如,如果您有如下代码 val result = Await.result(so

我正在处理一个scala代码,其中第三方库返回一个未来的[Boolean]对象,而我需要在我的scala代码中使用这个未来的对象,该代码完全以同步方式编写


目前,我正在对第三方lib操作执行wait.result,以确保它只返回布尔值。有没有更好的方法来处理这个问题,我的scala代码需要一个布尔值来进行进一步的操作?

正如Luis在评论中指出的,一般来说,除了等待
未来的
之外,别无选择

也就是说,您可以选择在哪里等待

例如,如果您有如下代码

val result = Await.result(someFuture, Duration.Inf)
f(result)
Future
land中运行
f
可能更有用

Await.result(someFuture.map(f), Duration.Inf)
如果
f
发生阻塞,则可能值得将
f
包装在
blocking
中,或者显式使用
ExecutionContext
,该上下文将为
映射处理大量被阻塞的线程(例如,线程可能多于核心的线程)


一般来说,你会希望尽可能地将
wait
s移动到代码的最外边缘,甚至可以移动边缘。

正如路易斯在评论中指出的那样,一般来说,除了等待
未来的
之外,别无选择

也就是说,您可以选择在哪里等待

例如,如果您有如下代码

val result = Await.result(someFuture, Duration.Inf)
f(result)
Future
land中运行
f
可能更有用

Await.result(someFuture.map(f), Duration.Inf)
如果
f
发生阻塞,则可能值得将
f
包装在
blocking
中,或者显式使用
ExecutionContext
,该上下文将为
映射处理大量被阻塞的线程(例如,线程可能多于核心的线程)


通常,您会希望尽可能将
wait
s移动到代码的最外边缘,甚至可以移动边缘。

如果您不能或不想填充
Future
的整个代码并使其异步,那么没有比阻塞线程等待值更好的方法了。在一天结束时,同步代码在任何情况下都会这样做。如果您不能或不想填充
未来的整个代码并使其异步,那么没有比阻塞线程等待值更好的方法了。最终,同步代码在任何情况下都会这样做。