Ich habe eine Iteration vals: Iterable[T]
und eine lang andauernde Funktion ohne relevante Nebenwirkungen: f: (T => Unit)
. Im Moment ist dies vals
in der offensichtlichen Weise angewandt:Concurrent map/foreach in scala
vals.foreach(f)
ich die Anrufe f
möchte gleichzeitig zu tun (in Grenzen). Gibt es irgendwo in der Scala-Basisbibliothek eine offensichtliche Funktion? Etwas wie:
Concurrent.foreach(8 /* Number of threads. */)(vals, f)
Während f
ziemlich lange läuft, ist es kurz genug, dass ich will nicht den Aufwand für einen Thread für jeden Anruf aufgerufen wird, so dass ich bin auf der Suche nach etwas, basierend auf einem Thread-Pool.
Seien Sie vorsichtig, dass 'Vals' eine strikte Sammlung ist - wenn es faul ist (und in Scala 2.7 dies beinhaltet die' Range' Klasse), werden die Futures erst erstellt, wenn jeder von 'foreach' und nichts wird parallel passieren. –
Ich nehme an, wir könnten dieses Problem lösen, indem wir einen weiteren "foreach" -Ruf zwischen der "map" und der aktuellen "foreach" einfügen. Also: 'vals map {x => Zukunft {f (x)}} foreach {x => x} foreach {_()}' –
Das wäre eine Karte, die wir injizieren müssen, keine weitere foreach? Und mir ist nicht klar, dass die Karte einer faulen Sammlung streng ist. Der sicherste Weg ist, nachArray zu rufen. –