Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Project Reactor-订阅并行调度程序';行不通_Kotlin_Project Reactor_Reactive Streams - Fatal编程技术网

Kotlin Project Reactor-订阅并行调度程序';行不通

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

我正在查看示例和阅读文档,在尝试以并行方式订阅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.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()
仍然不会产生输出。