Ho un attore Akka responsabile della gestione delle chiamate http. Io uso scala spedizione per inviare più richieste HTTP su un'API:Come gestire più promesse in un attore (akka)?
urls.foreach { u
val service = url(u)
val promise = Http(service OK as.String).either
for(p <- promise)
{
p match
{
case Left(error) =>
faultHandler(error)
case Right(result) =>
resultHandler(result)
}
}
Nella funzione resultHandler
, ho incrementare un'istanza variabile nbOfResults
e confrontare il numero di chiamate che ho fatto.
def resultHandler(result:String)
{
this.nbOfResults++
...
if(nbOfResults == nbOfCalls)
// Do something
}
È sicuro? Si può accedere allo nbOfResults
accessibile allo stesso tempo se due chiamate restituiscono i risultati simultaneamente?
Per ora, ho ritenuto che l'attore sia più o meno equivalente a un thread e pertanto le funzioni di callback non vengono eseguite contemporaneamente. È corretto ?
Le risposte che seguono contengono suggerimenti su come farlo, vorrei solo per indicare chiaramente per la cronaca che sì, è Bisogna stare attenti con i callback asincroni, ESSI SARANNO ESEGUITI CONCORRENTI. Quindi, in breve, la gestione di nbOfResults nel codice sopra non è corretta. –