Monix中Task.parSequenceUnordered返回结果顺序不符合预期的疑问
Monix中Task.parSequenceUnordered返回结果顺序不符合预期的疑问
我之前看到Task.parSequenceUnordered的官方说明是:
"is like parSequence, except that you don’t get ordering for results or effects."
也就是它不会保证结果或者副作用的顺序。那按照这个描述,我写了下面这段代码,原本以为会返回List(2, 1),但实际运行下来结果却是List(1, 2),用异步执行的方式也没改变这个结果,想请熟悉Monix的朋友帮忙解惑一下,谢谢!
首先是同步执行的代码:
import monix.eval.Task import monix.execution.Scheduler.Implicits.global object TaskSequence extends App { val taskOne = Task { Thread.sleep(3000) println("First executed") 1 } val taskTwo = Task { Thread.sleep(2000) println("Second executed") 2 } val parallelUnordered = Task.parSequenceUnordered(List(taskOne, taskTwo)).runSyncUnsafe() println(s"Return vals for Task.parSequenceUnordered( ) were $parallelUnordered") }
运行这段代码时,taskTwo只需要休眠2秒,会比taskOne先完成——控制台确实会先打印Second executed,再打印First executed,但最终返回的结果列表却是List(1, 2),这和我预期的按任务完成顺序返回结果不一样。
我又试了异步执行的方式,结果还是一样:
Task.parSequenceUnordered(List(taskOne, taskTwo)).runAsync( result => result match { case Right(value) => println(value) case Left(value) => value }) Thread.sleep(5000) // 防止程序提前退出
按道理,先完成的任务应该先出现在结果列表里才对,为什么实际不是这样呢?有没有Monix的专家能帮忙解释下这个问题?
备注:内容来源于stack exchange,提问作者Zeke1999
相关产品推荐
相关产品推荐

