Kotlin Project Reactor-订阅并行调度程序';行不通
我正在查看示例和阅读文档,在尝试以并行方式订阅Flux时发现了一些问题 我有3个函数,如下所示Kotlin Project Reactor-订阅并行调度程序';行不通,kotlin,project-reactor,reactive-streams,Kotlin,Project Reactor,Reactive Streams,我正在查看示例和阅读文档,在尝试以并行方式订阅Flux时发现了一些问题 我有3个函数,如下所示 private val log = LoggerFactory.getLogger("main") private val sequence = Flux.just(1, 2) fun a() { sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) } sequence.subs
private val log = LoggerFactory.getLogger("main")
private val sequence = Flux.just(1, 2)
fun a() {
sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) }
sequence.subscribe { log.info(">>> {}", it) }
}
fun b() {
sequence.subscribe { log.info(">>> {}", it) }
}
fun c() {
sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) }
}
现在,当我分别运行每个方法时,函数a()
和b()
的输出是正确的,但是c()
的输出是空的。这是意料之中的事,是故意的吗?如果是这样,为什么会发生这种情况?Flux.just(…)
捕获值,因此被优化为在订阅线程中立即执行
当您使用subscribeOn
时,您可以将订阅线程
从main
更改为其他内容,从而使完全
异步
在a()
在c()
中,主线程没有这种阻塞。因此,测试在异步just
有时间发出任何东西之前终止,这就是为什么您看不到任何输出
要使其更可见,请添加一个线程。sleep(10)
,您将看到一些输出。Flux.just(…)
捕获值,从而优化为在订阅线程中立即执行
当您使用subscribeOn
时,您可以将订阅线程
从main
更改为其他内容,从而使完全
异步
在a()
在c()
中,主线程没有这种阻塞。因此,测试在异步just
有时间发出任何东西之前终止,这就是为什么您看不到任何输出
为了使其更清晰可见,添加一个线程。sleep(10)
,您将看到一些输出。当然,您直接使用只是
,而不使用延迟
我只是在尝试一点实验的同时,遵循核心参考文档和早期示例。既然你清楚地知道这个解释,请把它变成一个答案。在这一点上,defer
并不能告诉我太多。实际上,我是基于RxJava的,但是如果你从Flux.defer
返回Flux.just
,你就可以在不同的线程上调度它,而just
会立即运行,这样它的执行就不能移动到不同的线程。我在寻找一个像Observable.fromCallable
这样的构造,但它似乎不存在,所以我认为Flux.defer{Flux.just
会起作用。你有机会试试吗?我按照建议的Flux.defer{Flux.just(1,2)}
方法c()
仍然不能产生输出。当然,您直接使用只是
,而不使用延迟
我只是按照核心参考文档和早期示例进行尝试。既然您清楚地知道解释,请将其写进回答中。延迟
在这一点上并不能告诉我太多。实际的ly我是基于RxJava的,但是如果你从一个Flux.defer
返回Flux.just
,你就可以将它安排在不同的线程上,而just
会立即运行,这样它的执行就不能移动到不同的线程。我正在寻找一个类似observatable.fromCallable
的结构,但它似乎不存在t、 因此,我认为Flux.defer{Flux.just
会起作用。您有机会尝试吗?我按照建议的Flux.defer{Flux.just(1,2)}
方法进行包装。方法c()
仍然不会产生输出。