我有两个任务:
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
})
我想并行启动它们,并在结果上运行一个函数(就像我对vs 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
的实现,这意图是使第一个句法语法具有吸引力,但我不能相信存在错误,所以我可能只是误用异步?