【发布时间】:2017-02-28 17:58:58
【问题描述】:
假设我有一个 URL 列表和一个下载相应文件的函数:
val urls = List(url1, url2, url3)
def fetch(url: String): File = ...
我想知道是否有比这更好的并行下载这些文件的方法:
val futureFiles: Future[List[File]] = Future {
urls.par.map(fetch)
}
futureFiles.map(files => ...)
我看到的一个问题是,现在我只能在文件全部下载后才能访问它们。如何做到简洁优雅,并且能够对每个下载的文件进行操作?
【问题讨论】:
-
顺便说一句,您不能将一些计算包装在
Future中并期望它是异步/非阻塞的(请参阅注释here)。如果它是那么简单,我会多么喜欢...... xD -
你最好不要使用Play WS library,或者其他一些真正异步的HTTP库。
-
@insane-e 给定一个正确配置的执行上下文,下载仍然会并行发生,这就是他所要求的,还是我错了?您是对的,您不能通过在将来包装阻塞代码来使其成为非阻塞,但这正是我们目前大多数 SQL 驱动程序的情况。是的,为 Play WS +1 :)
-
@fxlae 是的,它会并行执行。最终结果是一样的。 :) 唯一的区别是(我认为)运行这些 HTTP 请求的线程将被阻塞(等待,不做任何有用的操作)直到返回响应。
标签: scala parallel-processing future