gpt4 book ai didi

windows - 调用系统后 makePSOCKcluster 在 win x64 上挂起

转载 作者:可可西里 更新时间:2023-11-01 12:04:02 24 4
gpt4 key购买 nike

我在 Windows 上的 R x64 上使用 parallel 包的 makePSOCKcluster 遇到了一个难以调试的问题。它不会发生在 Windows 上的 R i386 上,也不会发生在任何 OSX 或 Linux 上。不幸的是,它也不会一直发生,只是偶尔且相当随机。

发生的是 makePSOCKcluster 函数超时并卡住 R session ,但前提是在 session 的早些时候执行了一些(任意)system() 调用。下面的视频和脚本更清楚地说明了这个问题。

一些我尝试过但没有成功的东西:

  • 禁用防病毒/防火墙。
  • 在调用 systemmakePSOCKcluser 之间等待几秒钟。
  • 使用不同的系统调用。

我该如何进一步缩小范围?这里the video视频中使用的脚本是:

cmd_exists <- function(command){
iswin <- identical(.Platform$OS.type, "windows");
if(iswin){
test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE, show.output.on.console=FALSE), silent=TRUE));
} else {
test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE), silent=TRUE));
}
!is(test, "try-error")
}

options(hasgit = cmd_exists("git --version"));
options(haspandoc = cmd_exists("pandoc --version"));
options(hastex = cmd_exists("texi2dvi --version"));
cluster <- parallel::makePSOCKcluster(1);

最佳答案

makePSOCKCluster,或更一般的 makeCluster,在创建所谓的 worker 进程时可能会因多种原因挂起,这涉及启动使用 Rscript 命令的新 R session 将执行 .slaveRSOCK 函数,这将创建一个返回到主服务器的套接字连接,然后执行 slaveLoop 函数,最终将执行主服务器发送给它的任务。如果启动任何工作进程时出现问题,master 将在执行 socketConnection 时挂起,等待工作进程连接到它,即使该工作进程可能已经死亡或从未成功创建。

使用 outfile 参数很棒,因为它经常揭示导致工作进程死亡并因此导致主进程挂起的错误。但如果这没有显示任何内容,则转到手动模式。在手动模式下,master 打印命令来启动每个 worker,而不是自己执行命令。它需要更多的工作,但它给了您完全的控制权,如果需要,您甚至可以调试工作程序。

这是一个例子:

> library(parallel)

> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt')
Manually start worker on localhost with
'/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

接下来打开一个新的终端窗口(命令提示符或其他),然后粘贴该 Rscript 命令。一旦您执行了它,makePSOCKcluster 应该会返回,因为我们只请求了一个 worker。当然,如果出现问题,它不会返回,但如果幸运的话,您会在终端窗口中收到一条错误消息,并且您将获得一条重要线索,有望解决您的问题.如果您不那么幸运,Rscript 命令也会挂起,您将不得不深入研究。

要调试 worker,您不需要执行显示的 Rscript 命令,因为您需要一个交互式 session 。相反,您可以使用如下命令启动 R session :

$ R --vanilla --args MASTER=localhost PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

在该 R session 中,您可以在 .slaveRSOCK 函数上放置一个断点,然后执行它:

> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()

现在您可以开始单步执行代码,可能会在 slaveLoop 和 makeSOCKmaster 函数上设置断点。

关于windows - 调用系统后 makePSOCKcluster 在 win x64 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17312144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com