ParallelFlowable中的sequential()如何工作?

时间:2018-03-23 03:47:38

标签: parallel-processing rx-java flowable

sequential()运算符是否将ParallelFlowable转换为Flowable流,这些流在剩余的并行任务仍在运行时或者仅在完成后才会发出项目?

例如:
考虑到我有5个需要并行执行的长时间运行的时变任务。我使用执行这些任务的ParallelFlowable;之后我添加了sequential()运算符;然后是take(1)运算符。我会...:

  • 在剩余的并行任务执行时获取第一个项目?或
  • 需要等到所有任务完成,之后ParallelFlowable转换为Flowable

我希望它应该是上述的优先事项,但需要确认。

1 个答案:

答案 0 :(得分:1)

如果您不确定RxJava在某些简单情况下的行为,最好的方法是使用几个System.out.println().test()和一些.assertValues()来编写一个小程序或单元测试/ .assertNotComplete() /等。在不同的地方,看看在何时何地发生的事情。

source
.doOnNext(v -> System.out.println("Source sent: " + v))
// .operator1()
// .operator2()
// etc.

RxJava是一个组合库,这意味着您可以经常隔离源,处理逻辑和最终使用者,以便对它们进行单独测试。例如,您可以使用发出常量响应的简单Observable.just()替换网络呼叫。在其他情况下,您可以创建PublishSubject并逐步调用onNext,检查每个后的预期状态。

 PublishSubject<Integer> publishSource = PublishSubject.create();

 Observable<Integer> squares = publishSource
 .map(v -> v * v);

为此,您经常需要将处理逻辑分解为所谓的函数变换器方法,该方法采用类型但无约束的源(即PublishSubject)并返回其他类型({ {1}})由测试消费者使用并验证。

Observable

最后,您可以使用最后一个 public static Observable<Integer> square(Observable<Integer> source) { return source.map(v -> v * v); } Observable<Integer> squared = square(Observable.just(2)); Observable<Integer> anotherSqr = square(publishSource); 来源或只是看看您可以打印到控制台的内容:

Observable

如果转换涉及异步或定时延迟,您可以插入 square(publishSource .doOnNext(v -> System.out.println("Input: " + v)) ) .subscribe( v -> System.out.println("Output: " + v), Throwable::printStackTrace, () -> System.out.println("Done") ); publishSource.onNext(1); // Input: 1 // Output: 2 publishSource.onNext(2); // Input: 2 // Output: 4 publishSource.onComplete(); // Done ,以便可以在输出/断言中分离对多个输入的响应。

(至于您的想要确认Thread.sleep()并不等待所有项目完成,它会在任何并行轨道发布后立即发出并且下游已准备好接收它们。)