与 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 方法?关于Future
的onComplete
?
另一个简单的解决方案是编写 Future{cursor.getAll.asScala}
但我认为内部工作线程将被阻塞以等待所有记录。
也许我错过了什么?
更新2
换句话说,有一种方法可以使用“异步非阻塞 IO”从 Ignite 获取记录列表?
最佳答案
Does trasforming an
Iterable
to aFuture[Seq]
make sense?
这取决于您的目标。
Iterable
是惰性的并且内存效率高。 Seq
是急切的,会占用更多内存。通过从 Iterable
到 Seq
,您实质上是在说:“在一切准备就绪并加载到内存中之前,我不想看到任何数据。”
通过将其设为 Future[Seq]
,您实质上是在说:“我会在(希望)所有数据元素准备就绪并加载到内存后回来。”
关于scala - 将 IgniteCursor[T]/Iterable[T] 转换为 Future[Seq[T]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52452304/