在另一个未来发出未来之前包装阻塞代码的正确方法

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