すべてのエラーメッセージが同じファイルにリダイレクトされるように、マルチセッションの並列処理でRコードを実行しようとしています。ただし、sink()
は作成できません。共有stderrリダイレクトを使用するマルチセッションの並列化
library(parallel)
cl <- makePSOCKcluster(2)
f <- function(){
withr::with_message_sink("messages.txt", Sys.sleep(10))
}
clusterCall(cl = cl, fun = f)
## Error in checkForRemoteErrors(lapply(cl, recvResult)) :
## 2 nodes produced errors; first error: Cannot establish message sink when another sink is active.
## Calls: clusterCall -> checkForRemoteErrors
## Execution halted
編集
応答のいくつかを考えると、私はこの記事の目的について詳しく説明すべきです。複数の並列バックエンドを持つRパッケージdrakeを開発中です。今日、新しいhook
argumentをmake()
に実装しました。wraps individual parallel jobsはfunction of the user's choiceです。私が実際に探しているのは、並列バックエンドに関係なくコンソールを消音するhook
です。現在の開発バージョンでバックエンドは、
parallel::mclapply()
parallel::parLapply()
base::lapply()
適切Makefile
future::sequential
future::multicore
- と
make -j
(1つのジョブのparLapply()
を介して)future.batchtools
backends listed here
私はstderrのために働いhook
を見つけたと思いました。
hook <- function(){
withr::with_message_sink("messages.txt", Sys.sleep(10))
}
しかし、withr::with_message_sink()
は私がparLapply()
またはfuture::multisession
バックエンドのために同じファイルに複数の労働者を沈ませません。
を使用することができます私は、私は同様の必要性/問題/解決策を持っていたと思うが、私は少しより多くの情報を必要としています。 'マルチセッション'とは、同じサーバー上の複数のアクティブセッションを話しているのでしょうか、複数のpidを使用していますか?主な目標は何ですか?私の場合と同じように、複数の大きなジョブを並行して実行する必要がありました。繰り返しを実行するとエラーがスローされますが、tryCatchにエラーが記録されますが、意図的に何かをストールしません... –
私の編集を見てください。自分のニーズは珍しい。あなたのケースでは、[開発用ドレープ](https://github.com/wlandau-lilly/drake)が役に立ちます。エラーメッセージと呼び出しスタックを含む、失敗したターゲットに関する詳細なエラー情報を取得する新しい['diagnose()'関数(https://github.com/wlandau-lilly/drake/issues/114)を実装しました。 – landau
'drake :: failed()'と 'drake :: diagnose()'関数は、コンソールに出力される通常のエラーメッセージの厳密な必要性を取り除きます。私は11月にCRANのアップデートを予定しています。 – landau