fs2 Task.start vs async

时间:2017-04-07 13:41:16

标签: task scalaz fs2

我有两个任务:

  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的实现,这意图是使第一个句法语法具有吸引力,但我不能相信存在错误,所以我可能只是误用异步?

0 个答案:

没有答案