在另一个未来发出未来之前包装阻塞代码的正确方法
Correct way to wrap code that blocks before emitting future in another future
我不得不将 dispatch http 请求包装到另一个 Future 中,因为看起来初始网络连接可能会阻塞(在 Netty 或它背后的任何东西中——例如,当计算机仅连接到另一台计算机时静态 IP 且无 DNS;在实际创建未来之前系统会阻塞十秒或更长时间)。所以而不是
Http(req.OK(JsonUTF))
我现在有
Future {
blocking(
Http(req.OK(JsonUTF))
)
} .flatMap(identity)
这是正确的吗? flatMap(identity)
相对于 flatten
是否有任何缺点,它仅在 Scala 2.12 中使用了一些 "internal executor"?
或者我应该使用
Future {
val jsonFut = blocking(
Http(req.OK(JsonUTF))
)
Await.result(jsonFut, Duration.Inf)
}
?
如果您执行以下操作,您可以通过一次 flatMap
调用来逃脱:
Future.successful(()).flatMap(_ => blocking { Http(req.OK(JsonUTF)) })
// 在 Scala 2.12 上,您可以将 Future.successful(()) 替换为 Future.UNIT
我不得不将 dispatch http 请求包装到另一个 Future 中,因为看起来初始网络连接可能会阻塞(在 Netty 或它背后的任何东西中——例如,当计算机仅连接到另一台计算机时静态 IP 且无 DNS;在实际创建未来之前系统会阻塞十秒或更长时间)。所以而不是
Http(req.OK(JsonUTF))
我现在有
Future {
blocking(
Http(req.OK(JsonUTF))
)
} .flatMap(identity)
这是正确的吗? flatMap(identity)
相对于 flatten
是否有任何缺点,它仅在 Scala 2.12 中使用了一些 "internal executor"?
或者我应该使用
Future {
val jsonFut = blocking(
Http(req.OK(JsonUTF))
)
Await.result(jsonFut, Duration.Inf)
}
?
如果您执行以下操作,您可以通过一次 flatMap
调用来逃脱:
Future.successful(()).flatMap(_ => blocking { Http(req.OK(JsonUTF)) })
// 在 Scala 2.12 上,您可以将 Future.successful(()) 替换为 Future.UNIT