gpt4 book ai didi

scala - 包装在 Future 中的同步 HTTP 请求是否受 CPU 或 IO 限制?

转载 作者:行者123 更新时间:2023-12-04 09:21:16 25 4
gpt4 key购买 nike

考虑以下两个片段,其中首先使用 Future 包装 scalaj-http 请求。 , 而第二个使用 async-http-client
Sync使用全局 EC 包裹 Future 的客户端

object SyncClientWithFuture {
def main(args: Array[String]): Unit = {
import scala.concurrent.ExecutionContext.Implicits.global
import scalaj.http.Http
val delay = "3000"
val slowApi = s"http://slowwly.robertomurray.co.uk/delay/${delay}/url/https://www.google.co.uk"
val nestedF = Future(Http(slowApi).asString).flatMap { _ =>
Future.sequence(List(
Future(Http(slowApi).asString),
Future(Http(slowApi).asString),
Future(Http(slowApi).asString)
))
}
time { Await.result(nestedF, Inf) }
}
}
Async使用全局EC的客户
object AsyncClient {
def main(args: Array[String]): Unit = {
import scala.concurrent.ExecutionContext.Implicits.global
import sttp.client._
import sttp.client.asynchttpclient.future.AsyncHttpClientFutureBackend
implicit val sttpBackend = AsyncHttpClientFutureBackend()
val delay = "3000"
val slowApi = uri"http://slowwly.robertomurray.co.uk/delay/${delay}/url/https://www.google.co.uk"
val nestedF = basicRequest.get(slowApi).send().flatMap { _ =>
Future.sequence(List(
basicRequest.get(slowApi).send(),
basicRequest.get(slowApi).send(),
basicRequest.get(slowApi).send()
))
}
time { Await.result(nestedF, Inf) }
}
}
片段正在使用
  • Slowwly模拟慢速 API
  • scalaj-http
  • async-http-client sttp 后端
  • time

  • 前者需要 12 秒,而后者需要 6 秒。似乎前者表现得好像受 CPU 限制,但是我不知道情况如何,因为 Future#sequence应该并行执行 HTTP 请求吗?为什么同步客户端包裹在 Future行为与正确的异步客户端不同?异步客户端在后台将调用包装在 Futures 中的情况不是这样吗?

    最佳答案

    Future#sequence should execute the HTTP requests in parallel?


    首先, Future#sequence不执行任何东西。它只是产生一个在所有参数完成时完成的 future 。
    如果 EC 中有空闲线程,则立即开始对构造 future 的评估(执行)。否则,它只是将它提交给某种队列。
    我确信在第一种情况下,你有单线程执行 future 。

    println(scala.concurrent.ExecutionContext.Implicits.global) -> parallelism = 6


    不知道为什么会这样,可能其他5个线程由于某种原因总是很忙。您可以尝试使用 5-10 个线程显式创建的新 EC。
    与 Async 情况的区别在于您不自己创建 future ,它是由库提供的,内部不会阻塞线程。它启动异步过程,“订阅”结果,并返回 future ,当结果到来时完成。
    实际上,异步库内部可以有另一个 EC,但我怀疑。
    顺便说一句,如果没有 blocking, future 不应该包含慢速/io/阻塞评估。 .否则,您可能会阻塞主线程池 (EC),您的应用程序将被完全卡住。

    关于scala - 包装在 Future 中的同步 HTTP 请求是否受 CPU 或 IO 限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63101178/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com