Автор фреймворка future здесь.
- Q1.Функция, подобная
purrr::map()
в future.apply::future_apply()
, также выполняется параллельно?
Нет.В 'purrr' нет ничего, что работает параллельно.
- Q2.Что произойдет, если я запусту
furrr::future_map()
внутри функции future.apply()
?
Она будет работать последовательно, то есть plan(sequential)
.Причина этого заключается в защите от рекурсивного вложенного параллелизма, который редко требуется.Это объясняется в будущей виньетке «Будущее за R: топологии будущего» * 1025 *.В некоторых случаях целесообразно использовать параллельный параллелизм, например распределенную обработку на нескольких машинах, когда вы, в свою очередь, выполняете параллельное соединение между несколькими ядрами на каждой машине.Это можно сделать с помощью
plan(list(tweak(cluster, workers = c("n1", "n2", "n3")), multisession))
- Q3.Предполагая, что я сделал выше, я бы включил еще один
plan(multiprocess)
вызов до furrr::future_map()
?
Вы не хотите устанавливать plan()
"внутри" вашего кода / функций.Оставьте управление plan()
тому, кто будет использовать ваш код / вызывать ваши функции.Кроме того, никто не хочет использовать вложенное количество ядер, например, в plan(list(tweak(multisession, workers = ncores), tweak(multisession, workers = ncores)))
, потому что в нем будут использоваться ncores^2
ядер, которые будут перегружать ваш компьютер.Использование количества ядер по умолчанию в качестве plan(list(multisession, multisession))
не будет иметь этой проблемы, потому что на втором уровне все равно будет доступно только одно ядро.