我有两个任务:
val t = System.currentTimeMillis()
def first: fs2.Task[Int] = fs2.Task.fromFuture(Future.successful {
println(s"${ System.currentTimeMillis() - t} - First")
Thread.sleep(100)
1
})
def second: fs2.Task[Int] = fs2.Task.fromFuture(Future.successful {
println(s"${System.currentTimeMillis() - t} - Second")
Thread.sleep(200)
2
})
我想并行启动它们,最后在结果上运行一个函数(几乎就像我对 Applicative map2 所做的那样)。这工作得很好:
val comb = for {
ta ← fs2.Task.start(first)
tb ← fs2.Task.start(second)
a ← ta
b ← tb
} yield {
println("Complete")
a + b
}
comb.unsafeRun()
输出:164 - 第一个 164 - 第二个
每次都写额外的行来理解有点乏味。令我惊讶的是
import fs2.interop.scalaz._
import scalaz.syntax.applicative._
val comb2 = (first |@| second) {_ + _}
输出:197 - 第一个 318 - 第二个
也不
val comb1 = for {
a ← first.async
b ← second.async
} yield {
a + b
}
输出:202 - 第一个 323 - 第二个
工作。在第一种情况下,任务是同时开始的,而在后两种情况下,它们是一个接一个地开始的。
我错过了什么?阅读async
我理解的实现,其目的是使第一个片段在语法上有吸引力,但我不敢相信有一个错误,所以我可能只是滥用异步?