JMa*_*Mac 9 monads scala future
我正在Scala中第一次使用Futures,正在研究使用flatMap组合器的例子; 我一直在关注这个讨论:
http://docs.scala-lang.org/overviews/core/futures.html
具体来说,这个例子:
val usdQuote = future { connection.getCurrentValue(USD) }
val chfQuote = future { connection.getCurrentValue(CHF) }
val purchase = for {
usd <- usdQuote
chf <- chfQuote
if isProfitable(usd, chf)
} yield connection.buy(amount, chf)
purchase onSuccess {
case _ => println("Purchased " + amount + " CHF")
}
Run Code Online (Sandbox Code Playgroud)
被翻译成这个:
val purchase = usdQuote flatMap {
usd =>
chfQuote
.withFilter(chf => isProfitable(usd, chf))
.map(chf => connection.buy(amount, chf))
}
Run Code Online (Sandbox Code Playgroud)
我掌握一点麻烦的是如何以及何时执行flatMap?
我知道usdQuote和chfQuote是在"某个时间"由"某个线程"执行的,并且它们的注册回调函数被调用,问题是:
a)usdQuote和chfQuote是否同时执行?(我很确定他们是).
b)flatMap如何将Future useQuote的值分配给usd?在操作usdQuote完成时,是否会调用它?
c)什么线程正在执行'flatMap'和'map'操作(可能更多是后一个问题的后续操作).
干杯.
Sea*_*ons 10
a)当你创建它们时,你已经开始对范围内的隐式ExecutionContext执行它们,因此它们可能同时运行,因为它取决于执行它们的方式.
b)它并没有真正赋值,但是实现使用onComplete方法使得一旦达到结果就会触发您传递的函数.目前,这应该链接到我所指的flatMap方法:https://github.com/scala/scala/blob/v2.11.2/src/library/scala/concurrent/Future.scala#L246
c)那些是通过前面提到的ExecutionContext运行的,还要考虑如果那些Future实例可以在不同的ExecutionContexts上运行,那么for-comprehension的部分可以在不同的线程池上运行.
| 归档时间: |
|
| 查看次数: |
7213 次 |
| 最近记录: |