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 } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |