代码之家  ›  专栏  ›  技术社区  ›  Davide Icardi i3arnon

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

  •  2
  • Davide Icardi i3arnon  · 技术社区  · 6 年前

    Scala Iterable[t] 到a Future[Seq[T]] ?

    IgniteCursor

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

    val iterable = cursor.asScala
    val result = iterable.toList
    
    Future{
      result
    }
    

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

    Iterable 到a Future[Seq] 有道理?

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

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

    最后我需要释放资源 close 功能。如果我写信 Future(cursor.asScala.toList) onComplete 未来

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

    更新2

    2 回复  |  直到 6 年前
        1
  •  2
  •   jwvh    6 年前

    变形金刚 Iterable 到a Future[Seq] 有道理?

    可迭代的 Seq 渴望并且会占用更多的记忆。从 可迭代的 顺序 你实际上是在说:“我不想看到任何数据,直到一切都准备好并加载到内存中。”

    未来 您实际上是在说:“我稍后会回来(希望)所有数据元素都准备好并加载到内存中。”

        2
  •  1
  •   Dima    6 年前

    getAll ,那么你能用它来“聪明”吗?您有两种选择:要么调用内联,要么卸载到线程。

    你能做的一件事就是把电话包起来 blocking :

    Future { 
       blocking { 
          cursor.getAll.asScala
       }
    }
    

    封闭本身并不坏。只有当它导致线饥饿时才是坏的。

    但是小心点。如果你的游标“很重”,而且你有很多游标并行运行,那么除了阻塞线程外,你会有问题。 例如,您可能会耗尽内存,因为您将尝试一次性拟合所有结果。否则你会让IO饱和。