scala - 将 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 获取记录列表?
解决方案
将 an
Iterable
转换为 aFuture[Seq]
有意义吗?
这取决于你的目标是什么。
Iterable
懒惰且内存效率高。Seq
是急切的,会占用更多的内存。通过 from Iterable
to Seq
you 本质上是在说:“在一切准备就绪并加载到内存之前,我不想看到任何数据。”
通过将其设为 a Future[Seq]
,您实质上是在说:“(希望)所有数据元素都准备好并加载到内存中之后,我会稍后再回来。”
推荐阅读
- c# - Stream 通过 .NET MVC 控制器动态创建文件内容
- java - servlet session-timeout(0) 不工作
- sql - 将多张表合并为一张表 SQL Server
- r - 使字符串集合成为按组排序的数据框,包含序列信息
- elasticsearch - 如何使用 go 在弹性搜索中按嵌套对象对文档进行排序?
- database - 在 Oracle Developer 中创建一个新数据库
- firebase - firebase 函数管理单个数据库触发器上的多个操作
- java - Android volley 单例和自定义 gridview 适配器
- php - 在 PHP 中解析日期
- java - 将不同子类的二维列表存储并获取到 Google Firebase