Я использую пакет R foreach()
с %dopar%
, чтобы делать длинные (~ дни) вычисления параллельно. Мне хотелось бы остановить весь набор вычислений в случае, если одна из них вызывает ошибку. Однако я не нашел способ добиться этого, и из документации и различных форумов я не нашел никаких указаний на то, что это возможно. В частности, break()
не работает, и stop()
останавливает текущий расчет, а не весь цикл foreach
.Есть ли способ вырваться из цикла foreach?
Обратите внимание, что я не могу использовать простой цикл, потому что в конечном итоге я хочу распараллелить это с помощью пакета 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"
То, что я хотел бы добиться того, что весь цикл Еогеасп может быть сразу же вышел на некоторое условие (здесь, когда 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
Невозможно использовать 'for' вместо этого? –
Нет, потому что в конечном итоге я хочу распараллелить это, используя пакет doRNG. (Извините, я не сделал это ясно в своем оригинальном посте: я отредактировал его, чтобы сделать это явным.) –
На основании ваших других комментариев вы можете захотеть, чтобы каждый подпроцесс мог установить объект «флаг» на и сделать этот объект доступным для чтения всеми подпроцессами. Все они должны иметь некоторую внутреннюю точку останова или эквивалент, которая регулярно проверяет значение «флага», поэтому все они могут самозакрываться. –