加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:49:03 所属栏目:安全 来源:网络整理
导读:我有一个负责处理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) c
我有一个负责处理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
}

安全吗?如果两个调用同时返回结果,可以同时访问nbOfResultsvaraible吗?

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

解决方法

以下是仅使用调度的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
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读