Мой вопрос прост, о методе Future.traverse. Итак, у меня есть список String-s. Каждая строка является URL-адресом веб-страницы. Затем у меня есть класс, который может принимать URL-адрес, загружать веб-страницу и анализировать некоторые данные. Все это завернуто в Future {}, поэтому результат обрабатывается асинхронно.Future.traverse, похоже, работает последовательно, а не параллельно. Это правда?
Класс упрощен вид:
class RatingRetriever(context:ExecutionContext) {
def resolveFilmToRating(url:String):Future[Option[Double]]={
Future{
//here it creates Selenium web driver, loads the url and parses it.
}(context)
}
}
Тогда в другом объекте у меня есть это:
implicit val executionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(2))
.......
val links:List[String] = films.map(film => film.asInstanceOf[WebElement].getAttribute("href"))
val ratings: Future[List[Option[Double]]] = Future.traverse(links)(link => new RatingRetriever(executionContext).resolveFilmToRating(link))
Когда он работает, я могу определенно видеть это проходит сбор последовательно. Если я изменяю контекст выполнения из пула фиксированного размера в пул одиночных потоков, то поведение остается прежним. Так что я действительно удивляюсь, как я могу сделать работу Future.traverse параллельной. Вы можете посоветовать?
'Future.traverse' работает параллельно. Если контекст выполнения имеет два фиксированных потока, он берет первые две ссылки для загрузки и анализа, чем следующие два и так далее. –
@PeterNeyens: Возможно. Если бы это было так, я бы не поставил этот вопрос :) Я отлаживал его довольно много. Итак, для каждой ссылки создается экземпляр веб-драйвера Selenium, который запускает браузер Firefox и загружает страницу. Если бы у меня было 2 ссылки, я бы увидел 2 браузера, но я вижу только одну открытую, загруженную страницу, затем браузер закрыт, затем открывается один и т. Д. Если я изменю размер пула потоков, скажем, 4 (у меня 4 ядра в моем процессоре), то ничего не меняется. Так что, вероятно, дело не в Future.traversal, а в чем-то другом, но я не могу понять это ... –
Тогда, пожалуйста, предоставьте код, который компилирует, который может показать поведение, которое вы описываете. –