R の foreach
パッケージで並列処理するとき、通常は次のように書きます。
R
library(doParallel) # foreach も読みこまれる
cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
rnorm(i)
}
stopCluster(cl)
しかし、この書き方だと foreach
の中でエラーが生じた場合、stopCluster(cl)
が実行されないという問題が生じます。
そこで、tryCatch()
を使って次のように書くことになります。
R
tryCatch({
cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
rnorm(i)
if(i==2) stop("Error!")
}
}, finally = {
stopCluster(cl)
})
この書き方は、やや複雑で可読性が悪いです。
そこで、偉大なるごみ箱師に教えて頂いた on.exit()
を使うやり方を紹介します。
R
ExecuteParallelProcess <- function() {
cl <- makeCluster(detectCores())
registerDoParallel(cl)
on.exit(stopCluster(cl))
foreach(i = 1:3) %dopar% {
rnorm(i)
if(i==2) stop("Error!")
}
}
ExecuteParallelProcess()
このように書けば、関数を抜ける時に必ず stopCluster(cl)
が実行されるようになるので安心です。
on.exit()
便利ですね。他にも使える場面が色々ありそうです。