title: ParallelFlux vs flatMap() for a Blocking I/O task
body: <p>I have a Project Reactor chain which includes a blocking task (a network call, we need to wait for response).  I'd like to run multiple blocking tasks concurrently.  </p>
  
  <p>It seems like either ParallelFlux or flatMap() could be used, bare-bone examples:</p>
  
  <pre><code>Flux.just(1)
      .repeat(10)
      .parallel(3)
      .runOn(Schedulers.elastic())
      .doOnNext(i -&gt; blockingTask())
      .sequential()
      .subscribe()
  </code></pre>
  
  <p>or</p>
  
  <pre><code>Flux.just(1)
      .repeat(10)
      .flatMap(i -&gt; Mono.fromCallable(() -&gt; {blockingTask(); return i;}).subscribeOn(Schedulers.elastic()), 3)
      .subscribe();
  </code></pre>
  
  <p>What are the merits of the two techniques?  Is one to be preferred over the other?  Are there any alternatives?</p>