doc: 阅读reactor文档

This commit is contained in:
asahi
2025-04-03 12:54:05 +08:00
parent 16e06d6be2
commit 78eb257c4f

View File

@@ -41,8 +41,12 @@
- [`onCancel` \& `onDispose`](#oncancel--ondispose) - [`onCancel` \& `onDispose`](#oncancel--ondispose)
- [Threading and Schedulers](#threading-and-schedulers) - [Threading and Schedulers](#threading-and-schedulers)
- [Scheduler](#scheduler) - [Scheduler](#scheduler)
>>>>>>> ff85f3d (doc: 阅读reactor文档) - [createWorker](#createworker)
- [operators using default scheduler](#operators-using-default-scheduler)
- [switch thread context](#switch-thread-context)
- [publishOn](#publishon)
- [subscribeOn](#subscribeon)
- [`subscribeOn`原理](#subscribeon原理)
# Reactor # Reactor
## Reactive Programming ## Reactive Programming
@@ -588,6 +592,42 @@ reactor模型和rxjava模型类型是并发无关的并不强制要求并
- `Schedulers.newSingle()`:每次调用时都使用一个专属线程 - `Schedulers.newSingle()`:每次调用时都使用一个专属线程
- `Schedulers.elastic()`:该上下文是一个`无界、弹性的线程池`。在引入`Schedulers.boundedElastic()`方法后,该方法不再推荐被使用。 - `Schedulers.elastic()`:该上下文是一个`无界、弹性的线程池`。在引入`Schedulers.boundedElastic()`方法后,该方法不再推荐被使用。
- `Schedulers.boundedElastic()`:该上下文是一个`有界、弹性的线程池`。通常将阻塞的任务放到该线程池中,令其不会占用其他资源。根据设置,该方法能够提供两种不同的实现: - `Schedulers.boundedElastic()`:该上下文是一个`有界、弹性的线程池`。通常将阻塞的任务放到该线程池中,令其不会占用其他资源。根据设置,该方法能够提供两种不同的实现:
- `ExecutorService-based`:会在多个tasks之间对平台线程进行重用 - `ExecutorService-based`:会在多个任务之间重用平台线程(即使用相同工作线程执行多个任务)
- `Virtual-thread-per-task-based``jdk21+`支持该特性对每个任务都会开启一个新的虚拟线程并且实现并没有维护idle pools
#### createWorker
在Scheduler中`idleQueue`中的线程会在空闲一段时间后自动销毁,但是通过`createWorker`手动创建的worker必须手动销毁在使用完成后调用`release`
#### operators using default scheduler
通常情况下部分operators在未显式指定的前提下会使用默认的scheduler通常可显式指定一个不同的scheduler
例如,`Flux.interval(Duration.ofMillis(300))`方法会生成`间隔300ms的ticks`。默认情况下,其会使用`Schedulers.parallel`可以通过如下代码指定一个新的scheduler:
```java
Flux.interval(Duration.ofMillis(300), Schedulers.newSingle("test"))
```
#### switch thread context
reactor提供了两种方法来切换执行的上下文
- `publishOn`
- `subscribeOn`
> publishOn和subscribeOn用友如下区别
> - publishOn方法在reactive chain中的位置若发生变化会对各个节点的执行上下文造成影响
> - subscribeOn方法在reactive chain中位置若发生变化并不会对各个节点的执行上下文造成影响
#### publishOn
`publishOn`操作符和作用和其他操作符类型,都是从上游接收到信号并且将信号传递到下游,但是,在执行下游的回调时,通过`Scheduler`中的worker进行调度。
故而,`publishOn`会对reactor chain中后续operators造成如下影响
- 修改执行上下文执行的线程由scheduler决定
- 按照规范,`onNext`的调用是有序的故而publishOn后续的操作都会使用同一个worker进行调度对于所有数据都在同一线程中执行worker在subscribe时决定publishOn使用的worker
#### subscribeOn
`subscribeOn`影响订阅的过程通常推荐将其放在source之后。
##### `subscribeOn`原理
`FluxSubscribeOn#subscribeOrReturn`中,会通过`scheduler#createWorker`创建worker