Я пытаюсь понять асинхронные вычисления на cats.effect.IO
примерах и получил некоторое недопонимание. Метод unsafe
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
.