multithreading - 经典与反应式方法中的连接、请求和线程
问题描述
我正在研究反应性的含义,因为它是一种低级别的差异,与常见的非反应性方法相比,我想了解发生了什么。让我们以Tomcat作为服务器(我猜它会与netty不同)
没反应
- 创建来自浏览器的连接。
- 对于来自线程池的每个请求线程,都会对其进行处理。
- 线程完成处理后,通过连接将结果返回给另一端。
反应性???
Tomcat 或 Netty 是如何完成的。我找不到任何关于 Tomcat 如何支持反应式应用程序以及 Netty 如何以不同方式实现这一点的文章(连接、线程、请求级别解释)
困扰我的是,当您仍然需要等待响应时,如何使网络服务器解除阻塞。您可以通过响应式更快地获得响应的第一部分,但这就是全部吗?我猜反应的要点是有效的线程利用,这就是我要问的。
解决方案
你的最后一点:“我想反应性的主要观点是有效的线程利用,这就是我要问的问题。”,这正是反应性方法的设计目的。
那么有效利用是如何实现的呢?
好吧,举个例子,假设您多次从服务器请求数据。
以典型的非反应性方式,您将为每个请求创建/使用多个线程(可能来自线程池)。一个特定线程的工作只是为该特定请求提供服务。线程将接受请求,将其提供给服务器并等待其响应,直到从服务器获取数据,然后将该数据带回客户端。
现在,以 Reactive 的方式,一旦有请求,就会为其分配一个线程。现在,如果出现另一个请求,将不会创建另一个线程,而是由同一个线程提供服务。如何?当线程向服务器发出请求时,它不会等待服务器的任何立即响应,而是会返回并服务其他请求。现在,当服务器搜索数据并且服务器可用时,将引发一个事件,然后线程将去获取该数据。这称为事件循环机制,因为在数据可用时调用线程的所有工作都是通过调用事件来完成的。现在,它分配了复杂性来映射对请求的确切响应。所有这些复杂性都被 Spring-Webflux(Java 中)抽象出来。所以整个过程变成了非阻塞的。由于只有一个线程就足以满足所有请求,因此不会有线程切换,我们每个 CPU 核心可以有一个线程。从而实现线程的有效利用。
推荐阅读
- reactjs - 结果显示书未在控制台中定义
- android - 颤振google_sign_in在没有firebase的情况下获取id令牌
- javascript - 反应导航中的自定义标题问题
- angular - 简化 Angular/Ionic 应用程序到 Docker 的部署
- python - python中返回的函数可以访问哪些数据?
- automation - 如何将 OG 元数据添加到 Shopify 描述?
- python - 在 python 中为 gcloud 命令捕获“HTTPError 404”
- html - 每次我打开 Live Server 时,浏览器中的打开选项卡总是显示我已完成的项目的图标
- java - ConfigProperty 未将值注入字段
- javascript - Javascript“未捕获的 TypeError:无法读取 null 的属性‘textContent’”