[英]makePSOCKcluster hangs on win x64 after calling system
我遇到了來自Windows上R x64上的parallel
包中的makePSOCKcluster
難以調試的問題。 它不會發生在Windows上的R i386上,也不會發生在任何OSX或Linux上。 不幸的是,它不會一直發生,只是偶爾而且非常隨機。
會發生什么是makePSOCKcluster
函數超時並凍結R會話,但只有在會話的早期執行了一些(任意) system()
調用。 下面的視頻和腳本更清楚地說明了問題。
我試過的一些東西沒有成功:
system
和makePSOCKcluser
之間等待幾秒鍾。 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
進程時會因任何原因而掛起,這涉及使用將執行.slaveRSOCK函數的Rscript命令啟動新的R會話,這將創建一個套接字連接回到master然后執行slaveLoop函數,它最終將執行master發送給它的任務。 當啟動任何工作進程時出現問題,主服務器將在執行socketConnection時掛起,等待工作者連接到它,即使該工作程序可能已經死亡或甚至從未成功創建過。
使用outfile參數非常好,因為它經常會顯示導致工作進程死亡的錯誤,從而導致主服務器掛起。 但如果沒有顯示任何內容,請轉到手動模式。 在手動模式下,主服務器打印命令以啟動每個工作程序,而不是執行命令本身。 這是更多的工作,但它可以讓您完全控制,如果需要,您甚至可以調試到工作人員。
這是一個例子:
> 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命令,因為您需要一個交互式會話。 相反,您使用以下命令啟動R會話:
$ R --vanilla --args MASTER = localhost PORT = 10187 OUT = log.txt TIMEOUT = 2592000 METHODS = TRUE XDR = TRUE
在該R會話中,您可以在.slaveRSOCK函數上放置一個斷點,然后執行它:
> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()
現在您可以開始逐步執行代碼,可能在slaveLoop和makeSOCKmaster函數上設置斷點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.