如何解决Scala 中的理解性半并行调用
我想在 seq 中对下一个进行第一个调用,然后使用 Scala 的期货进行接下来的 10 个相互并行的调用。我不想为地图平面图或内部进行编程以进行理解,因为它们会增加不可读性。一个人可以理解吗。
参考代码:
val fcaAndFplAccountDetails = getFcaAndFplAccount(fplId)
def orgDetailsIO(orgId:Int) = getOrgDetails(orgId)
def unbilledTxns(orgid: Int) = getUnbilledTxns(orgId)
for {
accDetails <- fcaAndFplAccountDetails
orgDetails <- orgDetailsIO(accDetails.orgId)
unbilledTxns <- unbilledTxnsIO(accDetails.orgId)
... other calls that depend on org id
} yield { ... further computations }
fcaAndFplAccountDetails
之后的调用能否在理解中并行化?
解决方法
也许跟随一个带有值定义的生成器,对应该并行执行的调用使用等号
for {
accDetails <- fcaAndFplAccountDetails
orgDetailsF = orgDetailsIO(accDetails.orgId)
unbilledTxnsF = unbilledTxnsIO(accDetails.orgId)
orgDetails <- orgDetailsF
unbilledTxns <- unbilledTxnsF
} yield { ... further computations }
或用 Applicative
传达想法import cats.implicits._
fcaAndFplAccountDetails.flatMap { accDetails =>
(
orgDetailsIO(accDetails.orgId),unbilledTxnsIO(accDetails.orgId)
).mapN((orgDetails,unbilledTxns) => {
... further computations
}
}
,
必须有几十个选项,但只有一个:
val fcaAndFplAccountDetails : Future[Int] = ???
def orgDetailsIO(orgId:Int) : Future[_] = ???
def unbilledTxns(orgid: Int) : Future[_] = ???
for {
accDetails <- fcaAndFplAccountDetails
(orgDetails,unbilledTxns) <- Future.sequence(List(orgDetailsIO(accDetails),unbilledTxns(accDetails))).map(el => (el(0),el(1)))
} yield ()
你也可以使用Future.traverse
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。