为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这个线程池不同时执行 HTTP 请求?

为什么这个线程池不同时执行 HTTP 请求?

慕斯王 2021-12-01 14:34:27
我编写了几行代码,将向我机器上运行的服务发送 50 个 HTTP GET 请求。该服务将始终sleep 1第二个并返回一个带有空正文的 HTTP 状态代码 200。正如预期的那样,代码运行了大约 50 秒。为了加快速度,我尝试创建一个ExecutorService有 4 个线程的线程,这样我就可以始终同时向我的服务发送 4 个请求。我预计代码运行大约 13 秒。final List<String> urls = new ArrayList<>();for (int i = 0; i < 50; i++)    urls.add("http://localhost:5000/test/" + i);final RestTemplate restTemplate = new RestTemplate();final List<Callable<String>> tasks = urls        .stream()        .map(u -> (Callable<String>) () -> {            System.out.println(LocalDateTime.now() + " - " + Thread.currentThread().getName() + ": " + u);            return restTemplate.getForObject(u, String.class);        }).collect(Collectors.toList());final ExecutorService executorService = Executors.newFixedThreadPool(4);final long start = System.currentTimeMillis();try {    final List<Future<String>> futures = executorService.invokeAll(tasks);    final List<String> results = futures.stream().map(f -> {        try {            return f.get();        } catch (InterruptedException | ExecutionException e) {            throw new IllegalStateException(e);        }    }).collect(Collectors.toList());    System.out.println(results);} finally {    executorService.shutdown();    executorService.awaitTermination(10, TimeUnit.SECONDS);}final long elapsed = System.currentTimeMillis() - start;System.out.println("Took " + elapsed + " ms...");因此,出于调试目的,我将 HTTP 请求更改为sleep调用:// return restTemplate.getForObject(u, String.class);TimeUnit.SECONDS.sleep(1);return "";现在代码按预期工作:...Took 13068 ms...所以我的问题是为什么带有 sleep 调用的代码按预期工作,而带有 HTTP 请求的代码却没有?我怎样才能让它按照我预期的方式行事?
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

从信息中,我可以看出这是最可能的根本原因:

您发出的请求是并行完成的,但满足这些请求的HTTP 服务器一次处理 1 个请求

因此,当您开始发出请求时,executor service fires up the requests concurrently, 因此您会同时获得前 4 个。

但是HTTP 服务器可以一次响应一个请求即每个请求1 秒后。

现在,当第一个请求完成时,执行程序服务会选择另一个请求并触发它,这一直持续到最后一个请求。

一次在 HTTP 服务器上阻止 4 个请求,这些请求一个一个地串行提供

要了解Proof of Concept这个理论,您可以做的是使用消息服务(队列),它可以同时从 4 个通道接收测试。那应该减少时间。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信