From f8c55e97091a4dc71627d0df2e152a971c469bb6 Mon Sep 17 00:00:00 2001 From: asahi Date: Tue, 1 Apr 2025 01:31:52 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBreactor=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/webflux/Reactor.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/spring/webflux/Reactor.md b/spring/webflux/Reactor.md index e247943..02730b0 100644 --- a/spring/webflux/Reactor.md +++ b/spring/webflux/Reactor.md @@ -38,7 +38,10 @@ - [hybird push-pull model](#hybird-push-pull-model) - [`sink.onRequest`](#sinkonrequest) - [`onCancel` \& `onDispose`](#oncancel--ondispose) + - [Threading and Schedulers](#threading-and-schedulers) + - [Scheduler](#scheduler) - [Handle](#handle) +>>>>>>> ff85f3d (doc: 阅读reactor文档) # Reactor @@ -529,6 +532,21 @@ Flux bridge = Flux.create(sink -> { `sink`支持`onCancel`和`onDispose`回调,其区别如下: - `onDispose`回调用于执行cleanup操作,其在`complete`, `error`, `cancel`之后都会被调用。 - `onCancel`回调用于执行取消操作,其只针对`cancel`执行,并且执行顺序位于cleanup之前 +### Threading and Schedulers +reactor模型和rxjava模型类型,是并发无关的,并不强制要求并发模型。并且,大多数operator其运行的线程都和前一个operator相同。 + +`除非显式指定,否则最顶层的operator(source)也会运行在subscribe方法被调用的线程中`。 + +#### Scheduler +在reactor中,操作执行在哪个线程中取决于`使用的Scheduler`。Scheduler和ExectuorService类似,负责对任务进行调度,但是相比于ExecutorService其功能更加丰富。 + +`Scheudlers`类中存在如下静态方法,分别访问不同的`execution context`: +- `Schedulers.immediate()`:没有执行上下文,被提交的任务会在当前线程中被立马执行 +- `Schedulers.single()`:线程上下文为一个`单个、可重用`的线程上下文。该方法会对所有的调用都使用相同的线程,直到scheduler被`disposed` +- `Schedulers.newSingle()`:每次调用时都使用一个专属线程 +- `Schedulers.elastic()`:该上下文是一个`无界、弹性的线程池`。在引入`Schedulers.boundedElastic()`方法后,该方法不再推荐被使用。 +- `Schedulers.boundedElastic()`:该上下文是一个`有界、弹性的线程池`。通常将阻塞的任务放到该线程池中,令其不会占用其他资源。根据设置,该方法能够提供两种不同的实现: + - `ExecutorService-based`:会在多个tasks之间对平台线程进行重用, 其使用示例如下所示: ```java