scala - 如何在(akka)Actor 中处理多个 promise ?

标签 scala akka actor

我有一个负责处理 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)
     }
  }

resultHandler函数,我增加了一个实例变量 nbOfResults并与我完成的通话数量进行比较。
def resultHandler(result:String)
{
  this.nbOfResults++
  ...
  if(nbOfResults == nbOfCalls)
    // Do something
}

安全吗? 5月nbOfResults如果两个调用同时返回它们的结果,是否可以同时访问变量?

目前,我认为 actor 或多或少相当于一个线程,因此回调函数不是并发执行的。这是正确的吗 ?

最佳答案

这是仅使用 dispatch 的 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
        }
    }
}

关于scala - 如何在(akka)Actor 中处理多个 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688408/

相关文章:

scala - Future Recursion Patterns/Future Chaining 任意长度

java - Akka : How to get actor causing exception on supervisor

scala - 集群 Akka/Scala actor

c++ - C++ Actor 系统的消息接收

java - AKKA .conf 文件配置到 .properties 文件

scala - 在 Scala 中实现蕴涵逻辑运算符

scala - 使用 Play Framework 的 Cached API 在多语言网站中缓存操作

scala - 为什么 PersistentActor 的方法 persist 不返回 Future?

scala - 将序列传递给不使用类型归属的可变参数方法

Scala 使用可变条目填充或制表