scala - 将 IgniteCursor[T]/Iterable[T] 转换为 Future[Seq[T]]

标签 scala asynchronous future ignite iterable

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 方法?关于FutureonComplete

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

也许我错过了什么?

更新2

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

最佳答案

Does trasforming an Iterable to a Future[Seq] make sense?

这取决于您的目标。

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

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

关于scala - 将 IgniteCursor[T]/Iterable[T] 转换为 Future[Seq[T]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52452304/

相关文章:

javascript - 在循环内进行异步调用,直到找到一个值

javascript - 遍历 Q 中的 promise

dart - 错误 : The argument type '(File) → Future<dynamic>' can't be assigned to the parameter type '(dynamic) → FutureOr<dynamic>'

Scala:在没有重叠的情况下滑动列表? (将列表中的连续元素对分组)

scala - 带有列Scala的Spark Select

scala - Aux 模式在 Scala 中完成了什么?

java - @Async 不适用于任务 :executor

ios - 手动 KVO 通知导致串行队列崩溃

java - 返回在响应的特定条件下首先执行的 future

scala - 有条件合并列表元素