I have iteration vals: Iterable[T]
e una funzione di lunga durata senza effetti collaterali rilevanti: f: (T => Unit)
. In questo momento questo viene applicato al vals
in modo ovvio:Mappa concorrente/foreach in scala
vals.foreach(f)
Vorrei le chiamate f
essere fatto contemporaneamente (entro limiti ragionevoli). Esiste una funzione ovvia da qualche parte nella libreria di base di Scala? Qualcosa di simile:
Concurrent.foreach(8 /* Number of threads. */)(vals, f)
Mentre f
è ragionevolmente lungo in esecuzione, è abbastanza breve che non voglio che il sovraccarico di invocare un thread per ogni chiamata, quindi sono alla ricerca di qualcosa sulla base di un pool di thread.
Fai attenzione che 'vals' è una raccolta rigorosa - se è pigro (e in Scala 2.7 questo include la classe' Range'), i futuri non saranno creati fino a quando ognuno è necessario da 'foreach', e nulla accadrà in parallelo. –
Suppongo che potremmo risolvere questo problema iniettando un'altra chiamata 'foreach' tra' map' e corrente 'foreach'. Quindi: 'vals map {x => future {f (x)}} foreach {x => x} foreach {_()}' –
Questa sarebbe una mappa che dobbiamo iniettare, non un'altra foreach? E non mi è chiaro che la mappa di una collezione pigra sia rigorosa. Il modo più sicuro potrebbe essere quello di chiamare aArray. –