Преобразовать IgniteCursor [T] / Iterable [T] в будущее [Seq [T]] - PullRequest
0 голосов
/ 22 сентября 2018

С Scala , как я могу преобразовать Iterable[t] в Future[Seq[T]]?

В основном я хочу прочитать все значения, возвращаемые запросом в Apache Ignite, который возвращает IgniteCursor .

Я хочу читать с этого курсора неблокирующим способом.

Я могу написать:

val iterable = cursor.asScala
val result = iterable.toList

Future{
  result
}

Но я думаючто этот код блокирует, а не асинхронный.Я прав?

Имеет ли смысл преобразование Iterable в Future[Seq]?

ОБНОВЛЕНИЕ

Моя цель - получить небольшой список записей без блокировкипоток вызывающего или рабочий поток, потому что я получу много одновременных вызовов.

Мой Iterable на самом деле IgniteCursor, поэтому, я полагаю, внутренне он будет выполнять некоторые операции с сетью / базой данных.Обычно существуют методы для выполнения этих операций асинхронно.Например, чтобы прочитать одно значение, я могу использовать getAsync вместо get.
. Для курсора у меня есть только функция getAll, поэтому я решил использовать Iterable разумным способом.
Насколько я понимаю, при использовании асинхронных методов потоки не блокируются, но они могут выполнять другие задачи до завершения работы сети.Я ожидал бы функцию, которая возвращает Future / IgniteFuture или обратный вызов.
Есть способ получить все записи без блокировки потока?

Наконец, чтобы правильно освободить ресурсы, которые янужно вызвать close функцию.Если я напишу Future(cursor.asScala.toList), когда должен вызываться метод close?На onComplete из Future?

Другое простое решение - написать Future{cursor.getAll.asScala}, но я полагаю, что внутренне рабочий поток будет заблокирован для ожидания всех записей.

Может быть, я что-то упустил?

ОБНОВЛЕНИЕ 2

Другими словами, есть способ получить список записей из Ignite, используя «Асинхронный неблокирующий ввод-вывод»?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я не понимаю.Если все, что у вас есть, - getAll, то насколько «умным» вы можете быть с этим?У вас есть два варианта: либо вызвать его встроенным, либо разгрузить в поток.

Одна вещь, которую вы можете сделать, это обернуть вызов в blocking:

Future { 
   blocking { 
      cursor.getAll.asScala
   }
}

Это говорит исполнителю, что рабочий поток будет блокироваться, поэтому он не будет учитываться в пределе пула потоков.Блокировка сама по себе не плохо.Плохо только тогда, когда это приводит к истощению потоков.

Но будьте осторожны с этим.Если ваши курсоры «тяжелые», и у вас много параллельных запущенных программ, у вас будут проблемы, кроме заблокированных потоков.Например, вам может не хватить памяти, потому что вы будете пытаться разместить все результаты сразу.Или вы будете насыщать IO.

0 голосов
/ 22 сентября 2018

Имеет ли смысл преобразование Iterable в Future[Seq]?

Это зависит от ваших целей.

Iterable лениво и памятьэффективный.Seq стремится и займет больше памяти.Переходя от Iterable к Seq, вы по сути говорите: «Я не хочу видеть какие-либо данные, пока все не будет готово и загружено в память».

Делая это Future[Seq], вы становитесьпо сути, говоря: «Я вернусь позже, когда (надеюсь) все элементы данных будут готовы и загружены в память».

...