博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛皮的异步非阻塞(webFlux)
阅读量:3951 次
发布时间:2019-05-24

本文共 1722 字,大约阅读时间需要 5 分钟。

异步非阻塞,我感觉比较关键的一点就是延迟执行,tomcat处理请求的线程不是阻塞的,而是将处理的逻辑丢给另一个线程去处理,因此,这个线程不是阻塞的。

具体的理论指导,我觉得这篇文章写得不错:

里面有一段话 我觉得讲的很好:

那么当有200个线程同时并发在处理,那么当来201个请求的时候,就已经处理不了,因为所有的线程都阻塞了。这是3.0之前的处理情况

而3.0之后异步处理是怎样处理呢?学过Netty通信框架的同学会比较容易理解一点,Servlet3.0类似于Netty一样就一个boss线程池和work线程池,boss线程只负责接收请求,work线程只负责处理逻辑。那么servlet3.0规范中,这200个线程只负责接收请求,然后每个线程将收到的请求,转发到work线程去处理。因为这200个线程只负责接收请求,并不负责处理逻辑,故不会被阻塞,而影响通信,就算处理非常耗时,也只是对work线程形成阻塞,所以当再来请求,同样可以处理,其主要应用场景是针对业务处理较耗时的情况可以减少服务器资源的占用,并且提高并发处理速度。

下面是我的代码的演示:

@GetMapping("/delay1")    public Mono
delayResult() {
long l = System.currentTimeMillis(); Mono
resultMono = Mono.fromSupplier(()->{
try {
Thread.sleep(5_000); } catch (InterruptedException e) {
e.printStackTrace(); } return new RestResult().setMessage("hello world!!"); }); long r = System.currentTimeMillis(); log.info("执行时间 {} !!",(r-l)); return resultMono; }@GetMapping("/delay2") public RestResult delayResult2() {
long l = System.currentTimeMillis(); Supplier
result = () -> {
try {
Thread.sleep(5_000); } catch (InterruptedException e) {
e.printStackTrace(); } return new RestResult<>().setMessage("ok"); }; RestResult restResult = result.get(); long r = System.currentTimeMillis(); log.info("执行时间 {} !!",(r-l)); return restResult; }

对于业务逻辑,假设 处理这个业务 耗时 5秒,而处理请求的 线程如果可以立刻返回的话,请求线程就是异步非阻塞的:

下面是代码打印结果:

在这里插入图片描述

请求 delay1 接口,tomcat 线程处理接收到后,立刻返回,而处理第二个接口,tomcat线程则是阻塞,等到处理完毕后再返回。
虽然目前请求量少,体现不出区别,但是,当请求量非常大的时候,异步非阻塞的好处就会看到了。

转载地址:http://tmuzi.baihongyu.com/

你可能感兴趣的文章
Linux查看物理CPU个数
查看>>
Linux学习之网络IO,磁盘io
查看>>
ES7.6.2安装
查看>>
查看jar依赖树
查看>>
idea运行gradle项目
查看>>
es安装ltr插件
查看>>
开源ltr-es-7.6.2代码到本地idea打开出现各种错误总结
查看>>
Requests实践详解&& python通过连接开启https的elasticsearch7 服务器
查看>>
ES查询流程源码解析
查看>>
ldaps与ldap over TLS
查看>>
jvm为什么把-Xms和-Xmx的值设置成一样
查看>>
2021-01-21对map进行key或者value排序
查看>>
ConcurrentHashMap 1.7和1.8的区别
查看>>
阻塞锁与自旋锁
查看>>
【面试官:select语句和update语句分别是怎么执行的
查看>>
scala学习之安装问题
查看>>
LDAP常见错误码
查看>>
linux yum安装rpm包出现问题
查看>>
idea编译报错类似xxx.java:[85,65] 错误: 找不到符号
查看>>
ArrayList复制
查看>>