【问题标题】:Awaiting all Scala Futures to complete等待所有 Scala Futures 完成
【发布时间】:2015-06-05 21:17:05
【问题描述】:

我使用支持并发操作https://github.com/sksamuel/scrimage的图像库有这样的理解:

for (
      file <- myDirectory.listFiles;
      image <- AsyncImage(file);
      scaled <- image.scale(0.5)
      // possibly more ops here? 
    )
    {
      scaled.writer(Format.PNG).write(new File(dirOutput + file.getName))
    }

这是write()的定义:

def write(out: OutputStream)(implicit executionContext: ExecutionContext): Future[Unit] = Future {
  writer.write(out)
}

我想要做的是等到我目录中的所有图像在我的程序关闭之前完成调整大小。从我从 SO 上的其他帖子中收集到的内容基本上是将所有这些 Futures 填充到 Futures 列表中,并使用Await 来完成...有人可以帮我吗?

【问题讨论】:

  • 我最初的想法是对图像总数使用倒计时锁存器并用它来阻塞主线程,但我认为这不符合 Scala Futures 的思维方式
  • 您在寻找Future.sequence 吗? Future.sequence
  • @jilen 可能 .. 我玩累了,但不能让它工作,也许你可以在这里告诉我如何使用它?
  • val futs = for {xxxx} yield {scaled.writer()....} ; Future.sequence(futs),这样的东西会起作用。你好像不是yield这里的未来
  • 我试过了,发现 [error] : scala.concurrent.Future[scala.concurrent.Future[Unit]] [error] required: scala.collection.GenTraversableOnce[?] [error] image

标签: scala future scrimage


【解决方案1】:

您遇到的问题是您混合了两种不同的单子理解,即listFiles 返回一个List[File]image.scale 返回一个Future[Image]。虽然两者都可以用于理解,但它们不能混合使用。另外,image &lt;- AsyncImage(file) 应该是一个赋值,因为它只是返回一个实例:

// start the scaling operations (this is a List comprehension)
val scaleOps: List[Future[Unit]] = for {
  file <- myDirectory.listFiles
  image = AsyncImage(file)

  // Now transform the image into a Future[Unit] with a nested Future comprehension
  ops = for {
    scaled <- image.scale(0.5)
    written <- scaled.writer(Format.PNG).write(new File(dirOutput + file.getName)) 
  } yield { written }
} yield { ops }

// collect and await the results
Await.result(Future.sequence(scaleOps), 10 minutes)

在外部理解中,&lt;- 总是从List 生成一个项目,yield 返回最终列表。

在内部理解中,&lt;- 总是产生Future 的值,允许您将其用作另一个调用的输入,从而产生Future,从而从image 中产生Future[Unit]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2015-05-27
    • 2010-09-20
    • 2021-04-14
    相关资源
    最近更新 更多