1

我有两个任务:

  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我理解的实现,其目的是使第一个片段在语法上有吸引力,但我不敢相信有一个错误,所以我可能只是滥用异步?

4

0 回答 0