首页 > 解决方案 > 将 IgniteCursor[T]/Iterable[T] 转换为 Future[Seq[T]]

问题描述

使用Scala,如何将 a 转换Iterable[t]为 a Future[Seq[T]]

基本上我想读取 Apache Ignite 上的查询返回的所有值,该查询返回IgniteCursor

我想以非阻塞方式从该光标读取。

我可以写:

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

Future{
  result
}

但我认为这段代码是阻塞的,而不是异步的。我是正确的?

将 anIterable转换为 aFuture[Seq]有意义吗?

更新

我的目标是在不阻塞调用者线程或工作线程的情况下获得一小部分记录,因为我将收到许多并发调用。

我的内部Iterable实际上是一个IgniteCursor所以我想它会执行一些网络/数据库操作。通常有一些方法可以异步执行这些操作。例如,要读取一个值,我可以使用getAsync而不是get.
对于光标,我只有getAll功能,所以我的想法是以Iterable聪明的方式使用。
我的理解是,当使用异步方法时,线程不会被阻塞,但它们可以自由地执行其他任务,直到网络操作完成。我希望有一个返回Future/IgniteFuture或回调的函数。
有没有办法在不阻塞线程的情况下获取所有记录?

最后,为了正确释放资源,我需要调用close函数。如果我写Future(cursor.asScala.toList)什么时候应该调用 close 方法?上?onComplete_Future

另一个简单的解决方案是编写Future{cursor.getAll.asScala},但我认为内部工作线程将被阻塞以等待所有记录。

也许我错过了什么?

更新 2

换句话说,有一种方法可以使用“异步非阻塞 IO”从 Ignite 获取记录列表?

标签: scalaasynchronousfutureigniteiterable

解决方案


将 anIterable转换为 aFuture[Seq]有意义吗?

这取决于你的目标是什么。

Iterable懒惰且内存效率高。Seq是急切的,会占用更多的内存。通过 from Iterableto Seqyou 本质上是在说:“在一切准备就绪并加载到内存之前,我不想看到任何数据。”

通过将其设为 a Future[Seq],您实质上是在说:“(希望)所有数据元素都准备好并加载到内存中之后,我会稍后再回来。”


推荐阅读