[Java 18_001] Asynchronous 和 Non-blocking 的比较

Spring Framework 5 中添加了 Spring WebFlux 框架,在其文档介绍中,出现了 non-blocking 的概念:

The reactive stack, web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports Reactive Streams back pressure, and runs on servers such as Netty, Undertow, and Servlet 3.1+ containers.

我不理解 non-blocking 和 asynchronous 的区别,本文主要是学习参考这个 stackoverflow 的帖子的内容,主要参考 Daniel Earwicker, artm 和 Nikolai Fetissov 的答案:

  • Blocking 和 synchronous 意味着相同的事物:调用了一个 API,这个函数会一直占用线程直到它执行完毕或返回某些结果。
  • Non-blocking 意味着如果不能立即返回结果,API立即返回一个 error 并且不做其他事情。所以必须采用某种方法来知道 API 是否准备好被调用(使用一种有效的方法来模拟一个 wait,而避免在一个单线程的紧凑循环(tight loop)内进行人为轮询(manual polling)。non-blocking 涉及 轮询(polling)的概念,也就是间隔一段时间再重复检查所调用的 API 是否满足调用条件或返回结果。
  • Asynchronous 意味着 API 总是立即返回,已经启动了一种后台执行来处理你的请求,所以必须有某种方法来获得 API 执行结果。asynchronous涉及 并行(in parallel)的概念,也就是另外一个线程。

另一位网友 Yves 的回答也非常好:
synchronous / asynchronous 描述的是两个模块(modules)间的关系。
blocking / non-blocking 是描述一个模块的情况。
他举了一个例子:

“I”: a
“bookstore”: b
a asks b: do you have a book named “c++ primer”?

  • blocking: 在 b 回答 a 之前,a 会在那儿一直等待 b 的答案。现在 a(one module)是阻塞的(blocking)。a 和 b 是两个线程,两个进程还是一个线程或者一个进程?我们并不知道。
  • non-blocking: 在 b 回答 a 之前,a 会离开那里,之后每隔两分钟,a 会返回那里寻找 b 的答案。这时 a(one module)是非阻塞的(non-blocking),a 和 b 是两个线程还是两个进程还是一个进程我们并不知道,但是我们可以确认 a 和 b 不可能是一个线程。
  • synchronous: 在 b 回答 a 之前,a会一直在那里等待 b 的答案。这意味着在 b 完成它的工作返回答案之前,a 不能继续。这是我们说:a 和 b (two modules)是同步的,a 和 b 是两个线程还是两个进程还是一个线程或一个进程?我们并不知道。
  • asynchronous: 在 b 回答 a 之前,a 离开这里并且 a 可以做其他的工作,当 b 完成工作产生答案时,b 会通知 a:“嗨!我有答案了”。然后在 a 空闲的时候, a 将来到 b 这儿拿到那本书。现在我们可以说:a 和 b (两个模块)是异步的(asynchronous)。a 和 b 是两个线程和两个进程还是一个进程?我们并不知道,但是我们确信 a 和 b 不可能是一个线程。

参考资料

[1] spring framework 官方文档:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web-reactive.html#spring-webflux
[2] stackoverflow 论坛贴:https://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking

猜你喜欢

转载自blog.csdn.net/buildcourage/article/details/79038555
今日推荐