Tomcat 中的同步和异步请求处理有何不同?

How sync and async request processing differs in Tomcat?

我无法弄清楚 Tomcat 中同步和异步调用之间的区别。 我到处都使用 NIO。我有几千个连接由几个 Tomcat 线程管理。当长同步请求收到时,线程从 Tomcat 线程池中借用并处理请求。该线程等待长进程完成,然后将结果写入 HTTPResponse。所以资源只是为了等待而浪费。当长异步请求收到时,Tomcat 线程创建单独的线程,并且长进程在这个新线程中启动,Tomcat 线程 returns 立即进入池。 我理解对吗?如果是这样,我看不出同步和异步模式之间有任何区别,因为在这两种模式中使用相同数量的线程

区别是 "pull" 与 "push"。是的,你是对的,无论哪种方式,都必须分配一个线程来完成这项工作。

但是对于同步请求,您必须手动创建工作线程并从客户端轮询任务结果,而对于异步请求,服务器将在任务完成时将结果推送到客户端。

后者稍微高效一些,因为您的服务器不必为每个结果处理许多轮询请求。

谢谢,知道了。同步请求是一个线程为一个请求借用并等待和拉取必要数据的情况。异步请求是一种情况,只有一个线程与等待数据的请求分离,并将其推送到请求异步上下文,即客户端的输出流。当客户端产生 aync 请求时,它不会创建任何额外的线程,但它的异步上下文代表订阅者列表。当数据出现时,一个线程遍历此列表并将数据写入每个异步上下文。结果是 - 同步请求意味着每个请求一个线程,异步请求意味着一个(或更多)线程用于许多同时请求