Rxjava调度程序计算行为

时间:2018-03-01 15:12:13

标签: rx-java2

我注意到我的rxjava工作流程中存在一种奇怪的行为。

问题是当我将长数据流与短数据流组合时(取决于getEntries()返回的内容)。

长流需要几分钟,短流需要几秒钟。

通常情况下,即使短期订阅在长期订阅之后开始,它也会在之前获得onComplete。但是,在4次或5次尝试中的大约1次中,短流的onComplete是在较长的一次之后接收的。

我怀疑这是由于计算调度程序选择在长期订阅保持忙碌的rx线程上调度onComplete。令我难以置信的是,其他7个rx计算线程(8个核心机器)线程什么也没做。

我尝试在每个订阅上使用不同的线程,并且每次都按预期工作

Executor executor = Executors.newSingleThreadExecutor()

.observeOn(Schedulers.from(executor))
.subscribeOn(Schedulers.from(executor))

以下代码

服务

public Flowable<E> entryFlow()
{
    return Flowable
        .fromIterable(getEntries())
        .filter(Objects::nonNull)
        .concatMap(this::transformEntry);
}

Flowable<E> transformEntry(E entry)
{
    return Flowable.just(entry);
}
在某些情况下,

transformEntry可能会被覆盖,但在我的试运行中,它始终是一个元素,所以我不确定concatMap是否在此中扮演角色。

消费

service
      .entryFlow()
      .doOnCancel(this::onCancel)
      .observeOn(Schedulers.computation())
      .subscribeOn(Schedulers.computation())
      .subscribe(
                this::onNext,
                this::onError,
                this::onComplete);

我看了一下这个问题RxJava - Schedulers vs ExecutorService?和引用的博客文章和评论,但它仍然不清楚为什么会发生这种情况以及频率(4次中约1次)。

会对此有所了解。

谢谢

0 个答案:

没有答案