如何并行调用多个Flowable语句?

huangapple go评论78阅读模式
英文:

How to call multiple Flowable statements in parallel?

问题

接口包含函数

public interface XYZDownstreamService {
  Flowable<String> getData(Request request);
}

以下是调用者

public List<String> getDataFromDownstreamForRequests(List<Request> requests, XYZDownstreamService service) {
    List<String> dataFromDownstream = Lists.newArrayList();
    for (Request request : requests) {
        dataFromDownstream.add(service.getData(request).blockingFirst());
    }
    return dataFromDownstream;
}

我想要同时执行上述的函数调用,以优化for循环。最佳的方法是什么?

英文:

I have a few function calls that return Flowable object. I have to call this function multiple times and this function is doing some network calls. I want to do all these calls concurrently.
Below is the code.

Interface containing the function

public Interface XYZDownstreamService {

  Flowable&lt;String&gt; getData(Request request);
}

Below is the Caller

public List&lt;String&gt; getDataFromDownstreamForRequests(List&lt;Request&gt; requests, XYZDownstreamService service) {
    List&lt;String&gt; dataFromDownstream = Lists.newArrayList();
    for(Request request: requests) {
        dataFromDownstream.add(service.getData(request).blockingFirst());
    }
    return dataFromDownstream;
}

I want to do the above function calls concurrently to optimize the for a loop. What is the best way to do it?

答案1

得分: 2

你只需要使用 merge 或者 flatMap 来合并你的请求。此外,可以使用不同的线程来处理你的请求,使用 observeOn

Flowable.merge(requests
  .stream()
  .map(r -> service.getData(r)
              .observeOn(Schedulers.io())))
  .collect(toList())
).subscribe()

或者这样写:

Flowable.fromIterable(requests)
        .flatMap(r -> service.getData(r)
                .observeOn(Schedulers.io()))
        .subscribe();

我已经在一个类似的问题中回答过了,有更多的细节内容。

英文:

You just need to merge your requests using merge or flatMap. Moreover, use a diffrent threads to process your requests using observeOn.

Flowable.merge(requests
  .stream()
  .map(r -&gt; service.getData(r)
              .observeOn(Schedulers.io())))
  .collect(toList())
).subscribe()

Or write it like :

Flowable.fromIterable(requests)
        .flatMap(r -&gt; service.getData(r)
                .observeOn(Schedulers.io()))
        .subscribe();

I've already reply to a similar question for more details.

huangapple
  • 本文由 发表于 2020年10月21日 03:11:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/64451859.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定