Sto implementando un algoritmo che può essere facilmente parallelizzato ma non è possibile capire come creare un numero adeguato di futuri e come abortire in anticipo. Al momento il contorno del codice è lungo queste lineeUso corretto dei futures nei calcoli paralleli
def solve: Boolean = {
var result = false
while(!result && i < iterations) {
val futures = (1 to threads) map { _ => solveIter(geInitialValues()) }
val loopResult = Future.fold(futures)(false)((acc, r) => acc || r)
result = Await.result(loopResult, Duration.Inf)
i+=1
}
}
def solveIter(initialValues: Values): Future[Boolean] = Future {
/* Takes a lot of time */
}
Il problema evidente è impostato esplicitamente livello di parallelismo che può o non può essere adatto per contesto di esecuzione corrente. Se tutti i futuri vengono creati in una sola volta, come fare in modo che Future.fold
termini prima?
cosa intendevi con 'come creare un numero adeguato di futuri' e quando 'abortire presto'? - interrompere se il primo futuro restituisce true? –
Sì, non mi piace il fatto che io stia arbitrariamente dividendo l'intero compito che ha unità di lavoro naturali e che 'fold' aspetta che tutte le attività siano completate. – synapse
Quindi, vuoi iniziare n calcoli di solveIter e non appena il primo ritorna vero, vuoi abortire gli altri e iniziare la prossima iterazione? Dovresti cercare callback o attori per farlo ... –