17 Stimmen

Gleichzeitiges Map/Foreach in Scala

Ich habe eine Iteration vals: Iterable[T] und eine langlaufende Funktion ohne relevante Nebenwirkungen: f: (T => Unit) . Zurzeit gilt dies für vals auf die offensichtliche Weise:

vals.foreach(f)

Ich möchte, dass die Anrufe an f gleichzeitig durchgeführt werden (innerhalb angemessener Grenzen). Gibt es eine offensichtliche Funktion irgendwo in der Scala-Basisbibliothek? Etwas wie:

Concurrent.foreach(8 /* Number of threads. */)(vals, f)

Während f relativ lange läuft, ist es kurz genug, dass ich den Overhead des Aufrufs eines Threads für jeden Aufruf nicht möchte, also suche ich nach etwas, das auf einem Threadpool basiert.

2voto

Apocalisp Punkte 34088

Die neueste Version von Funktions-Java verfügt über einige Gleichzeitigkeitsfunktionen höherer Ordnung, die Sie nutzen können.

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))

Und dann...

par.parMap(vals, f)

Denken Sie daran shutdown die pool .

0voto

Roland Punkte 21

Sie können die Parallele Sammlungen aus der Scala-Standardbibliothek. Sie sind genau wie gewöhnliche Sammlungen, aber ihre Operationen laufen parallel. Sie müssen lediglich eine par aufrufen, bevor Sie eine Sammlungsoperation aufrufen.

import scala.collection._

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X