同时执行两个fs2任务(非威慑)

时间:2017-09-21 09:02:30

标签: scala non-deterministic scalaz-stream fs2

使用Scalaz任务我使用scalaz.Nondeterminism.both

进行此操作
Nondeterminism[Task]
 .both(
   Task.now("Hello"),
   Task.now("world")
 )

Nondeterminism[Task].gatherUnordered()

如何使用fs2 0.9.x version任务执行相同的操作?

1 个答案:

答案 0 :(得分:3)

我假设您使用的是fs2版本0.9.x. 要并行执行多个任务,您只需拨打Task.start即可。 以下是文档中的示例:

for {
   f <- Task.start { expensiveTask1 }
   // at this point, `expensive1` is evaluating in background

   g <- Task.start { expensiveTask2 }
   // now both `expensiveTask2` and `expensiveTask1` are running

   result1 <- f
   // we have forced `f`, so now only `expensiveTask2` may be running

   result2 <- g
   // we have forced `g`, so now nothing is running and we have both results

 } yield (result1 + result2)

所以在你的情况下,它看起来像这样:

for {
  ta <- Task.start(Task.now("Hello"))
  tb <- Task.start(Task.now("World"))
  a <- ta
  b <- tb
} yield (a, b)

请注意,将来可能会用更少的样板来做这样的事情。在工作中有一个PR来添加Parallel类型类,这将允许我们写这样的东西:

(taskA, taskB).parMapN((a, b) => ...)