我正在通过cats.effect.IO
的例子来理解异步计算,并且有一些误解。不安全的方法unsafeRunAsync
看起来像是异步运行底层效果(我期望提供一些ContextShift
)。但是这个方法看起来就像这样:
final def unsafeRunAsync(cb: Either[Throwable, A] => Unit): Unit =
IORunLoop.start(this, cb)
没有提供ContextShift
或ExecutionContext
。下面是一个非常简单的示例:
object TestIo extends App {
println(s"Main thread = ${Thread.currentThread().getName}")
val io = IO {
println(s"Effect thread = ${Thread.currentThread().getName}")
Thread.sleep(1000)
}
io.unsafeRunAsync(_ => println(s"Callback thread = ${Thread.currentThread().getName}"))
println(s"Finished")
}
输出结果为:
Main thread = main
Effect thread = main
Callback thread = main
Finished
正如你所看到的,这里所有的操作都在主线程中同步运行。你能否解释一下unsafeRunAsync
?对我来说它似乎和unsafeRunSync
一样。