簡體   English   中英

調用系統后,makePSOCKcluster在win x64上掛起

[英]makePSOCKcluster hangs on win x64 after calling system

我遇到了來自Windows上R x64上的parallel包中的makePSOCKcluster難以調試的問題。 它不會發生在Windows上的R i386上,也不會發生在任何OSX或Linux上。 不幸的是,它不會一直發生,只是偶爾而且非常隨機。

會發生什么是makePSOCKcluster函數超時並凍結R會話,但只有在會話的早期執行了一些(任意) system()調用。 下面的視頻和腳本更清楚地說明了問題。

我試過的一些東西沒有成功:

  • 禁用防病毒/防火牆。
  • 在調用systemmakePSOCKcluser之間等待幾秒鍾。
  • 使用不同的系統調用。

我怎樣才能進一步縮小范圍? 這里視頻視頻中使用的腳本是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM