如何在(akka)Actor中处理多个Promise?

Yan*_*aze 5 scala actor akka

我有一个负责处理http调用的Akka actor.我使用scala dispatch通过API发送多个HTTP请求:

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)
     }
  }
Run Code Online (Sandbox Code Playgroud)

resultHandler函数中,我增加一个实例变量nbOfResults并与我所做的调用次数进行比较.

def resultHandler(result:String)
{
  this.nbOfResults++
  ...
  if(nbOfResults == nbOfCalls)
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

安全吗?愿nbOfResultsvaraible在同一时间被访问,如果两个电话同时返回结果?

现在,我认为actor或多或少等同于一个线程,因此回调函数不会同时执行.这是对的吗 ?

Tre*_*xXx 3

这是仅使用调度的 Alexey Romanov 响应的变体:

//Promises will be of type Array[Promise[Either[Throwable, String]]]
val promises = urls.map { u =>
    val service = url(u)

    Http(service OK as.String).either
}

//Http.promise.all transform an Iterable[Promise[A]] into Promise[Iterable[A]]
//So listPromise is now of type Promise[Array[Either[Throwable, String]]]
val listPromise = Http.promise.all(promises)

for (results <- listPromise) {
    //Here results is of type Array[Either[Throwable, String]]

    results foreach { result =>
        result match {
            Left(error) => //Handle error
            Right(response) => //Handle response
        }
    }
}
Run Code Online (Sandbox Code Playgroud)