我正在尝试理解 Monix 中的任务调度原则。以下代码(来源:https ://slides.com/avasil/fp-concurrency-scalamatsuri2019#/4/3 )只产生'1',正如预期的那样。
val s1: Scheduler = Scheduler(
ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor()),
ExecutionModel.SynchronousExecution)
def repeat(id: Int): Task[Unit] =
Task(println(s"$id ${Thread.currentThread().getName}")) >> repeat(id)
val prog: Task[(Unit, Unit)] = (repeat(1), repeat(2)).parTupled
prog.runToFuture(s1)
// Output:
// 1 pool-1-thread-1
// 1 pool-1-thread-1
// 1 pool-1-thread-1
// ...
当我们添加Task.sleep
到repeat
方法中
def repeat(id: Int): Task[Unit] =
Task(println(s"$id ${Thread.currentThread().getName}")) >>
Task.sleep(1.millis) >> repeat(id)
输出变为
// Output
// 1 pool-1-thread-1
// 2 pool-1-thread-1
// 1 pool-1-thread-1
// 2 pool-1-thread-1
// ...
这两个任务现在在一个线程上同时执行!很好:) 一些合作让步已经开始了。到底发生了什么?谢谢 :)
编辑:同样的情况发生在Task.shift
而不是Task.sleep
.