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

scala – 理解中的期货的执行顺序(顺序或并发)是什么?

发布时间:2020-12-16 09:58:05 所属栏目:安全 来源:网络整理
导读:val f: Future[Result] = for { x - ask(actorA,Request).mapTo[Int] // call pattern directly s - (actorB ask Request).mapTo[String] // call by implicit conversion d - (actorC ? Request).mapTo[Double] // call by symbolic name } yield Result(x,
val f: Future[Result] =
   for {
       x <- ask(actorA,Request).mapTo[Int] // call pattern directly
       s <- (actorB ask Request).mapTo[String] // call by implicit conversion
       d <- (actorC ? Request).mapTo[Double] // call by symbolic name
  } yield Result(x,s,d)

我想知道for-comprehension中的3个未来是否同时运行.这是从AKKA doc中提取的片段.我的猜测是,当它们被翻译成嵌套的平面地图/地图时,它们是连续的.谢谢!

解决方法

这些期货不同时运行,它们一个接一个地连续运行.

这个for-comprehension首先执行ask(actorA,Request).mapTo [Int].直到这个未来
完成后,for-comprehension中的下一个生成器不会被执行.

只有在询问(actorA,Request).mapTo [Int]之后,才执行for-comprehension的下一行(actorB ask Request).mapTo [String].

一旦这个未来完成,就会评估for-comprehension中的第三个表达,并开始第三个未来.

为了让这些期货同时运行,你必须首先开始所有三个期货,并且只在之后的for-comprehension中使用它们:

val fut1 = ask(actorA,Request).mapTo[Int]
val fut2 = (actorB ask Request).mapTo[String]
val fut3 = (actorB ask Request).mapTo[String]

for {
  x <- fut1
  s <- fut2
  d <- fut3
} yield Result(x,d)

(编辑:李大同)

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

    推荐文章
      热点阅读