【问题标题】:Scala Future or other way to execute Java void methods in parallelScala Future 或其他并行执行 Java void 方法的方式
【发布时间】:2013-11-22 11:09:55
【问题描述】:

我有以下代码:

stringList map copyURLToFile // List[String]

def copyURLToFile(symbol: String) = {
  val url = new URL(base.replace("XXX", symbol))
  val file = new File(prefix + symbol + ".csv")
  org.apache.commons.io.FileUtils.copyURLToFile(url, file)
}

如何让 copyURLToFile 并行执行?

Scala Futures 需要一个返回类型,但如果我创建 Future[Unit] 类型的 copyURLToFile,我应该从函数返回什么以及如何返回?

【问题讨论】:

  • Parallel map operations? 的可能重复项
  • 你可以在={之间添加future,就像这样:def copyURLToFile(symbol: String) = future{
  • 我尝试在 Future {} 中使用函数体并递归地遍历列表,但它不起作用。递归有效,但对 org.apache.commons.io.FileUtils.copyURLToFile 的调用无效(没有创建文件)。我猜问题是 Java 方法返回 void。
  • 实际上问题可能是我作为一个独立程序执行它,其主线程在工作线程可以执行之前终止,如此处所述stackoverflow.com/questions/10565475/…
  • Void 本身不是问题,问题是你的主线程没有访问结果,因此它不会等待它。

标签: scala future


【解决方案1】:

如果您想要一种非常简单的方法来并行化,那么只需使用 the parallel collections library 映射列表即可。

stringList.par.map(copyURLToFile).toList

【讨论】:

  • 效果很好。现在快多了。
【解决方案2】:

你需要返回一些东西,你怎么知道下载了哪些文件?

将您的代码更改为:

def copyURLToFile(symbol: String): (String,String) = {
  val url = new URL(base.replace("XXX", symbol))
  val file = new File(prefix + symbol + ".csv")
  org.apache.commons.io.FileUtils.copyURLToFile(url, file)
  return (symbol, file)
}

然后生成的集合将包含符号及其下载文件的路径。

【讨论】:

  • 更大的问题是代码不会等待下载完成,因为它不会尝试访问结果。
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
相关资源
最近更新 更多