Spring Boot Async 方法如何使用 ThreadPool 处理请求

Posted

技术标签:

【中文标题】Spring Boot Async 方法如何使用 ThreadPool 处理请求【英文标题】:How Spring Boot Async method handles request using ThreadPool 【发布时间】:2020-09-10 01:32:55 【问题描述】:

我无法理解异步是如何工作的。我知道网络服务器有自己的线程池来处理多个请求。当我们使用 Spring Boot 实现异步 Web 服务并使用 TaskExecutor 配置 "n" 个线程时,这是否意味着为每个线程创建 n 个线程应要求而来?

为了澄清,服务器将从其 ThreadPool 中将请求分配给一个线程。所以当这个线程开始执行并调用一个标记为 @Asynch 的函数时,它可以为每个传入线程创建另一个 "n" 个线程来处理异步工作。请让我知道我的理解是否正确。

如果我的理解是正确的,那么如何决定应该创建多少池大小?谁能举个例子。

【问题讨论】:

【参考方案1】:

有两件事,一个是一个 tomcat 线程池,每个请求都从其中获取一个线程并正在处理(这在 server.tomcat.max-threads 中配置)和一个用于运行 @Aync 的单独线程池任务。当您运行注释为异步的方法(实际上是任务)时,这将创建一个任务并在异步队列中等待。初始请求不会被阻止,如果您不等待异步完成将返回并继续执行他的工作。简单来说,用@Async注解一个方法会使其在单独的线程中执行,调用者不会等待完成。

【讨论】:

感谢您的回答消除了我的大部分疑虑。我无法得到的一件事是假设有 200 个不同的传入请求访问 @async 方法,我们应该创建一个大小为 200 的线程池? @AbhishekDash 没有必要,如果异步任务较轻,那么原始请求可能不是。如果你有很重的东西并且你不断地添加到异步队列中,那么你可能需要更多的线程。如果这些异步任务很繁重,那么您最好选择被动式。 感谢您的解释

以上是关于Spring Boot Async 方法如何使用 ThreadPool 处理请求的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中@Async的作用

Spring Boot -- Spring Boot进阶

Spring Boot 在关闭时关闭休眠会话 - 在 @Async 方法完成之前

spring-boot @Async 的使用自定义Executor的配置方法

Spring Boot2.0之@Async实现异步调用

Spring Boot 微服务异步调用 @EnableAsync @Async