同时执行两个 fs2 任务(非确定性)
Execute two fs2 tasks concurrently (non-determenistically)
我使用 Scalaz 任务 scalaz.Nondeterminism.both
:
Nondeterminism[Task]
.both(
Task.now("Hello"),
Task.now("world")
)
或 Nondeterminism[Task].gatherUnordered()
.
如何对 fs2 0.9.x version 任务做同样的事情?
我假设您使用的是 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
类型 class,这将允许我们写这样的东西:
(taskA, taskB).parMapN((a, b) => ...)
我使用 Scalaz 任务 scalaz.Nondeterminism.both
:
Nondeterminism[Task]
.both(
Task.now("Hello"),
Task.now("world")
)
或 Nondeterminism[Task].gatherUnordered()
.
如何对 fs2 0.9.x version 任务做同样的事情?
我假设您使用的是 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
类型 class,这将允许我们写这样的东西:
(taskA, taskB).parMapN((a, b) => ...)