并行执行计算量大的地图

时间:2015-11-19 23:46:54

标签: multithreading scala system.reactive reactive-programming rx-java

我是ReactiveX库的新手(我使用它的scala变体,RxScala)。

我有Observable以高比率发出值。我想将函数应用于Observablemap)的所有值。我在map中使用的函数在计算上相当昂贵。

有没有办法让线程池并行计算map阶段?

1 个答案:

答案 0 :(得分:7)

是的,有办法做到这一点。

我会将流缓冲到块中,并使用Schedulers.computation()(基于大小等于可用处理器数量的线程池使用Executor)在cpus上分配负载:

int chunkSize = 1000;
source
  .buffer(chunkSize)
  .flatMap(
    list -> 
      Observable
        .from(list)
        .map(expensive)
        .subscribeOn(Schedulers.computation()))
 ...

如果map操作足够昂贵,那么在没有buffer的情况下,您可能同样有效:

source
  .flatMap(
    x -> 
      Observable
        .just(x)
        .map(expensive)
        .subscribeOn(Schedulers.computation()))