Я использую пакет R foreach()
с %dopar%
для выполнения длинных (~ дней) вычислений параллельно. Мне хотелось бы остановить весь набор вычислений в случае, если одна из них вызывает ошибку. Однако я не нашел способ добиться этого, и из документации и различных форумов я не нашел никаких указаний на то, что это возможно. В частности, break()
не работает, а stop()
останавливает текущий расчет, а не весь цикл foreach
.
Обратите внимание, что я не могу использовать простой цикл for, потому что в конечном итоге я хочу распараллелить это с помощью пакета doRNG.
Вот упрощенная, воспроизводимая версия того, что я пытаюсь (показано здесь в серийном номере с %do%
, но у меня такая же проблема при использовании doRNG
и %dopar%
). Обратите внимание, что на самом деле я хочу параллельно использовать все элементы этого цикла (здесь 10).
library(foreach)
myfunc <- function() {
x <- foreach(k = 1:10, .combine="cbind", .errorhandling="stop") %do% {
cat("Element ", k, "\n")
Sys.sleep(0.5) # just to show that stop does not cause exit from foreach
if(is.element(k, 2:6)) {
cat("Should stop\n")
stop("Has stopped")
}
k
}
return(x)
}
x <- myfunc()
# stop() halts the processing of k=2:6, but it does not stop the foreach loop itself.
# x is not returned. The execution produces the error message
# Error in { : task 2 failed - "Has stopped"
То, что я хотел бы достичь, состоит в том, что весь цикл foreach может быть немедленно удален при некотором условии (здесь, когда встречается stop()
).
Я не нашел способа добиться этого с помощью foreach
. Кажется, мне нужен способ отправить сообщение всем остальным процессам, чтобы они тоже перестали.
Если это невозможно с foreach
, знает ли кто-нибудь об альтернативах? Я также пытался достичь этого с помощью parallel::mclapply
, но это тоже не работает.
> sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] C/UTF-8/C/C/C/C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] foreach_1.4.0
loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_3.0.0 iterators_1.0.6