在 Scala 中将异步库与同步代码混合使用的最佳实践是什么
What are some best practices to mix async libraries with sync code in scala
我正在编写 scala 代码,其中第 3 方库 returns 一个 Future[Boolean] 对象,而我需要在完全以同步方式编写的 scala 代码中使用这个 future 对象。
目前,我正在对第 3 方库操作执行 Await.result 以确保它 returns 只是布尔值。有没有更好的方法来处理这个问题,我的 scala 代码需要一个布尔值才能进一步操作?
正如 Luis 在评论中指出的那样,一般来说,除了在 Future
上 Await
ing 别无选择。
也就是说,您可以选择 Await
。
例如,如果您有这样的代码
val result = Await.result(someFuture, Duration.Inf)
f(result)
运行 f
在 Future
登陆
可能更有用
Await.result(someFuture.map(f), Duration.Inf)
如果 f
碰巧阻塞,那么可能值得将 f
包装在 blocking
中或显式使用 ExecutionContext
来处理它的很多线程map
.
被阻塞(例如线程数多于内核数)
一般来说,您会希望尽可能将 Await
移动到代码的最外层边缘,如果可以的话甚至移动边缘。
我正在编写 scala 代码,其中第 3 方库 returns 一个 Future[Boolean] 对象,而我需要在完全以同步方式编写的 scala 代码中使用这个 future 对象。
目前,我正在对第 3 方库操作执行 Await.result 以确保它 returns 只是布尔值。有没有更好的方法来处理这个问题,我的 scala 代码需要一个布尔值才能进一步操作?
正如 Luis 在评论中指出的那样,一般来说,除了在 Future
上 Await
ing 别无选择。
也就是说,您可以选择 Await
。
例如,如果您有这样的代码
val result = Await.result(someFuture, Duration.Inf)
f(result)
运行 f
在 Future
登陆
Await.result(someFuture.map(f), Duration.Inf)
如果 f
碰巧阻塞,那么可能值得将 f
包装在 blocking
中或显式使用 ExecutionContext
来处理它的很多线程map
.
一般来说,您会希望尽可能将 Await
移动到代码的最外层边缘,如果可以的话甚至移动边缘。