Mam aktora Akka odpowiedzialnego za obsługę połączeń HTTP. Używam scala wysyłkę wysłać wiele żądań HTTP przez API:Jak radzić sobie z wieloma obietnicami w aktorze (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)
}
}
W funkcji resultHandler
, że przyrost instancję zmiennej nbOfResults
i porównać z liczbą połączeń I zrobili.
def resultHandler(result:String)
{
this.nbOfResults++
...
if(nbOfResults == nbOfCalls)
// Do something
}
Czy to bezpieczne? Czy dostęp do nbOfResults
jest możliwy w tym samym czasie, jeśli dwa połączenia zwracają jednocześnie wyniki?
Na razie wierzyłem, że aktor jest mniej więcej równoważny wątkowi i dlatego funkcje zwrotne nie są wykonywane równocześnie. Czy to jest poprawne ?
Odpowiedzi zawierają sugestie, jak to zrobić, ja po prostu lubię wyraźnie stan na piśmie, że tak, muszą być ostrożni z asynchronicznymi wywołań zwrotnych, ONI ZOSTANĄ PRZYKŁADOWO UZYSKANE. Krótko mówiąc, twoja obsługa nbOfResults w powyższym kodzie jest nieprawidłowa. –