Создание параллельных исполняющих списков - PullRequest
2 голосов
/ 04 мая 2019

У меня есть функция, которая разбивает List [B] пополам и возвращает кортеж. Мне нужно освободить комбинаторы для их параллельного выполнения.

Если я делаю что-то вроде fl.map (x => x.map (...)), это не параллельно.

object Parallel {

  implicit class ParList[A](fl: Future[List[A]]) {

    private def split[B](l: List[B]): (List[B], List[B]) = l.splitAt(l.length / 2)

    def paralFilter(f: A => Boolean): Future[List[A]] = ???

    def paralFold(init: A)(f: (A, A) => A): Future[A] = ???
  }

Я понимаю, что я должен разделить список поэлементно через split [B] и выполнять комбинаторы с элементами параллельно. Как я могу это сделать?

1 Ответ

6 голосов
/ 04 мая 2019

Для этого используйте метод par из scala.collection.Parallelizable:

object Parallel {

  implicit class ParList[A](fl: Future[List[A]]) {

    private def split[B](l: List[B]): (List[B], List[B]) = l.splitAt(l.length / 2)

    def paralFilter(f: A => Boolean)(implicit ec:ExecutionContext): Future[List[A]] = 
      fl.map(_.par.filter(f).toList)

    def paralFold(init: A)(f: (A, A) => A)(implicit ec:ExecutionContext): Future[A] =
      fl.map(_.par.fold(init)(f))
  }
}
...