2017-04-07 1 views
1

J'ai une chaîne Project Reactor qui comprend une tâche de blocage (un appel réseau, nous devons attendre une réponse). J'aimerais exécuter plusieurs tâches de blocage simultanément.ParallelFlux vs flatMap() pour une tâche d'E/S bloquantes

Il semble que ce soit ParallelFlux ou flatMap() pourrait être utilisé, des exemples: os nus

Flux.just(1) 
    .repeat(10) 
    .parallel(3) 
    .runOn(Schedulers.elastic()) 
    .doOnNext(i -> blockingTask()) 
    .sequential() 
    .subscribe() 

ou

Flux.just(1) 
    .repeat(10) 
    .flatMap(i -> Mono.fromCallable(() -> {blockingTask(); return i;}).subscribeOn(Schedulers.elastic()), 3) 
    .subscribe(); 

Quels sont les avantages des deux techniques? L'un doit-il être préféré à l'autre? Y a-t-il des alternatives?

Répondre

4

parallel est adaptée pour la parallélisation des tâches à des fins de performance et répartition du travail entre les « rails » ou « groupes », dont chacun obtiennent leur propre contexte d'exécution de la Scheduler vous passez à runOn. En bref, il mettra tous vos cœurs de processeur à travailler si vous faites un travail intensif CPU. Mais vous faites le travail lié d'E/S ...

Donc dans votre cas, flatMap est un meilleur candidat. Cette utilisation de flatMap pour la parallélisation concerne davantage l'orchestration.

Ce sont à peu près les 2 alternatives, si vous ne comptez pas la saveur légèrement différente de flatMap que flatMapSequential est (concatMap ne permet pas vraiment la parallélisation).