Это пример, когда мы хотим запустить 3 IO параллельно.
def test: Unit = {
val ioA = IO.shift *> IO(println("Running ioA"))
// ioA: cats.effect.IO[Unit] = <function1>
val ioB = IO.shift *> IO(println("Running ioB"))
// ioB: cats.effect.IO[Unit] = <function1>
val ioC = IO.shift *> IO(println("Running ioC"))
// ioC: cats.effect.IO[Unit] = <function1>
val program: IO[Unit] = (ioA, ioB, ioC).parMapN { (_, _, _) => () }
// program: cats.effect.IO[Unit] = <function1>
program.unsafeRunSync()
}
Первый вопрос: а что, если в этом примере есть смысл использовать IO.shift?
Второй вопрос: что, если у нас есть List или IO, которые мы хотим запускать параллельно? Я создал функцию для этой задачи, но не знаю, существовала ли она уже в библиотеке
def parallelize(ios: List[IO[Unit]]): IO[Unit] = {
ios.foldLeft(IO.pure(())) { case (currentResult, currentItem) =>
(currentResult, currentItem).parMapN((_, _) => ())
}
}





Это работает с "cats-core: 1.1.0" и "cats-effect: 0.10.1"
import cats.instances.list._
import cats.syntax.parallel._
//ios: List[IO[A]]
ios.parSequence //IO[List[A]]
@KumarWaghmode преобразует его в список, и тогда у вас будет List[(A, IO[B])]. Затем вы можете использовать IO.pure вместе с flatMap для создания List[IO[(A, B)]]. После этого используйте parSequence и при необходимости конвертируйте обратно в Map.
Как выполнить Map [A, IO [B]] параллельно?