2013-11-22 3 views
1

У меня есть следующий фрагмент кода:Scala Future или другой способ выполнения Java недействительные методы параллельно

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 нужен тип возврата, но если я сделаю copyURLToFile типа Future [Unit], что и как я вернусь от функции?

+1

Возможный дубликат [Операции параллельной карты?] (Http://stackoverflow.com/questions/20092855/parallel-map-operations) – senia

+0

Вы можете просто добавить 'future' между' = 'и' {'следующим образом: 'def copyURLToFile (symbol: String) = future {' – senia

+0

Я пробовал иметь тело функции в Future {} и рекурсивно просматривал список, но это не сработало. Рекурсия работала, но звонки на org.apache.commons.io.FileUtils.copyURLToFile не производились (файлы не были созданы). Я думаю, проблема в том, что метод Java возвращает void. – krl

ответ

3

Если вам нужен очень простой способ распараллеливать это, то просто переместите список по списку, используя the parallel collections library.

stringList.par.map(copyURLToFile).toList 
+0

Отлично работает. Гораздо быстрее. – krl

0

Вам нужно что-то вернуть, как вы узнаете, в каких файлах загрузиться?

Изменить код будет:

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) 
} 

А затем полученную коллекция будет содержать символы пути к файлу, в котором они были загружены.

+0

Большая проблема заключается в том, что код не дожидается завершения загрузки, поскольку он не пытается получить доступ к результатам. – Blaisorblade

Смежные вопросы