Scala期货基础
我在Scala中有以下代码:Scala期货基础,scala,asynchronous,concurrency,promise,future,Scala,Asynchronous,Concurrency,Promise,Future,我在Scala中有以下代码: case class Water(temp: Int) case class Milk(temp: Int) def heatWaterFor(minutes: Int, water: Water) = Future { Thread.sleep(1000) Water(82) } def boilMilkFor(minutes: Int, milk: Milk) = Future { Thread.sleep(1000) Milk(90) }
case class Water(temp: Int)
case class Milk(temp: Int)
def heatWaterFor(minutes: Int, water: Water) = Future {
Thread.sleep(1000)
Water(82)
}
def boilMilkFor(minutes: Int, milk: Milk) = Future {
Thread.sleep(1000)
Milk(90)
}
def frothMilk(hotwater: Water, hotmilk: Milk) = Future {
Thread.sleep(1000)
hotmilk
}
val start = System.currentTimeMillis()
val milkMaker = for {
water <- heatWaterFor(10, Water(10))
milk <- boilMilkFor(5, Milk(10))
frothed = frothMilk(water, milk)
hotMilk <- frothed
} yield (hotMilk)
Await.ready(milkMaker, Duration.Inf)
val end = System.currentTimeMillis() - start
println(milkMaker.value + " , Time taken: "+((end/1000))+" seconds.")
case类水(温度:Int)
案例级牛奶(温度:Int)
def加热水(分钟:整数,水:水)=未来{
线程。睡眠(1000)
水(82)
}
def boilMilkFor(分钟:整数,牛奶:牛奶)=未来{
线程。睡眠(1000)
牛奶(90)
}
def泡沫牛奶(热水:水,热水牛奶:牛奶)=未来{
线程。睡眠(1000)
热牛奶
}
val start=System.currentTimeMillis()
val挤奶工=用于{
water我猜您是这样做的:。最后,它提到了为什么这段代码是连续的,以及如何将其并行化(最后一段代码)。请检查
简而言之,当你像这样使用时,你的每个变量(水
,牛奶
,起泡
)都会在上一次评估准备就绪时开始评估。这允许在以后的评估中使用上一次评估的结果,但会使计算顺序化
另外(不相关的)您创建未来的方法(heatWaterFor
等)不使用参数。A for expression被简化为一系列map
、flatMap
和with filter
操作。您特定的for expression被简化为如下:
heatWaterFor(10, Water(10))
.flatMap(water => boilMilkFor(5, Milk(10))
.flatMap(milk => frothMilk(water, milk))
val heatWater = heatWaterFor(10, Water(10))
val boilMilk = boilMilkFor(5, Milk(10))
val milkMaker = for {
water <- heatWater
milk <- boilMilk
hotMilk <- frothMilk(water, milk)
} yield (hotMilk)
正如您在这里看到的,下一个future的执行是在上一个future完成时开始的。因此,如果您希望并行执行它们,您需要执行以下操作:
heatWaterFor(10, Water(10))
.flatMap(water => boilMilkFor(5, Milk(10))
.flatMap(milk => frothMilk(water, milk))
val heatWater = heatWaterFor(10, Water(10))
val boilMilk = boilMilkFor(5, Milk(10))
val milkMaker = for {
water <- heatWater
milk <- boilMilk
hotMilk <- frothMilk(water, milk)
} yield (hotMilk)
val heatWater=热水器(10,水(10))
val boilMilk=boilMilkFor(5,牛奶(10))
val挤奶工=用于{
water你介意在这里发布相关代码吗?在SO中,只链接的答案是不受欢迎的。考虑到这一点,但是marstran已经在他的答案中发布了代码,所以我不会再发布了。