17 votes

Concurrente map/foreach en scala

J'ai une itération vals: Iterable[T] et une fonction longue sans effets secondaires pertinents : f: (T => Unit). En ce moment, cela est appliqué à vals de manière évidente :

vals.foreach(f)

J'aimerais que les appels à f soient effectués de manière concurrente (dans des limites raisonnables). Y a-t-il une fonction évidente quelque part dans la bibliothèque de base de Scala ? Quelque chose comme :

Concurrent.foreach(8 /* Nombre de threads. */)(vals, f)

Alors que f est raisonnablement long à s'exécuter, il est assez court pour que je ne veuille pas supporter les frais généraux de l'invocation d'un thread pour chaque appel, donc je recherche quelque chose basé sur un pool de threads.

2voto

Apocalisp Points 22526

La dernière version de Functional Java dispose de certaines fonctionnalités de concurrence d'ordre supérieur que vous pouvez utiliser.

import fjs.F._
import fj.control.parallel.Strategy._
import fj.control.parallel.ParModule._
import java.util.concurrent.Executors._

val pool = newCachedThreadPool
val par = parModule(executorStrategy[Unit](pool))

Et ensuite...

par.parMap(vals, f)

N'oubliez pas de shutdown le pool.

0voto

Roland Points 21

Vous pouvez utiliser les Collections Parallèles de la bibliothèque standard Scala. Ils sont similaires aux collections ordinaires, mais leurs opérations s'exécutent en parallèle. Il vous suffit d'ajouter un appel par avant d'invoquer une opération sur une collection.

import scala.collection._

val array = new Array[String](10000)
for (i <- (0 until 10000).par) array(i) = i.toString

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X