Mar*_*ert 5 parallel-processing r
以下最小示例...
require(Rmpi)
set.seed(1)
foo <- parallel::mclapply(seq_len(10), function(l)
lapply(1:10, function(x) mean(rnorm(10000, mean=x))),
mc.cores=4)
Run Code Online (Sandbox Code Playgroud)
... 产生类型的警告消息
1: In selectChildren(ac, 1) : error 'Interrupted system call' in select
2: In selectChildren(ac, 1) : error 'Interrupted system call' in select
3: In selectChildren(ac, 1) : error 'Interrupted system call' in select
Run Code Online (Sandbox Code Playgroud)
如何避免它们?
我用Rmpi
和parallel
的mclapply
一个包,这就是为什么我问。请注意,这已张贴在这里,但我还没有收到答复(还)。如果这很重要,我使用 Ubuntu 12.10、Emacs 24 和 R 2.15.2
我在使用 Open MPI 1.4.3 构建的 Rmpi 安装中看到了这个问题。我假设您也使用 Open MPI,因为您使用 Ubuntu。加载 Rmpi 调用MPI_Init
会导致SIGCHLD
信号被捕获而不是被忽略。我相信结果是,当子进程由exitSIGCHLD
分叉时,现在将被发送,这会意外中断. 如果这不会导致任何实际错误,您可以通过调用inside来阻止警告消息。mclapply
select
mclapply
mclapply
suppressWarnings
Open MPI 用户的邮件列表中对此问题进行了讨论,表明该问题已在 Open MPI 1.6 系列中的某个时刻得到解决,因此解决此问题的最佳解决方案可能是升级您的 MPI 安装(如果尚未升级)。
更新
我使用 Open MPI 1.6.5 和 1.7.3 尝试了您的示例,但问题仍然存在。我决定使用该包来实现一个将信号重置为默认处理的inline
函数。SIGCHLD
使用它,我可以运行您的示例而不会生成任何警告:
library(Rmpi)
library(inline)
includes <- "#include <signal.h>"
code <- "signal(SIGCHLD, SIG_DFL);"
ignchld <- cfunction(body=code, includes=includes, convention=".C")
ignchld()
foo <- parallel::mclapply(seq_len(10), function(l)
lapply(1:10, function(x) mean(rnorm(10000, mean=x))),
mc.cores=4)
Run Code Online (Sandbox Code Playgroud)
当然,禁用信号可能会给Rmpi带来一些问题。在这种情况下,您可以修改代码来保存和恢复处理程序SIGCHLD
,但我不知道这是否有必要。