R shinyで並列処理を行おうとしています。実行したい並列タスクは、Pythonスクリプトの呼び出しです。ただし、機能せず、結果をpythonからRにフェッチすることはできません。以下は、Rの光沢のあるPythonコードのサンプルです。App.R
library(shiny)
library(reticulate)
library(doParallel)
library(foreach)
ui <- fluidPage(
# Application title
titlePanel("Sample Program"),
mainPanel(
uiOutput("txtValue")
)
)
server <- function(input, output) {
source_python("../../PythonCode/Multiprocessing/multip.py")
cl <- makeCluster(detectCores(), type='PSOCK')
registerDoParallel(cl)
result <- foreach(i=1:5) %dopar% fsq(i)
stopCluster(cl)
output$txtValue <- renderUI({
result
})
}
shinyApp(ui = ui, server = server)
Pythonコード(multip.py)
def fsq(x):
return x**2
エラーメッセージは次のものとは無関係ですshiny
。
library(reticulate)
library(doParallel)
library(foreach)
library(parallel)
source_python("multip.py")
cl <- makeCluster(detectCores(), type = 'PSOCK')
registerDoParallel(cl)
# throws: Error in unserialize(socklist[[n]]) : error reading from connection
foreach(i = 1:5) %dopar% fsq(i)
stopCluster(cl)
私はこれを、R関数をシリアル化できるのでPython関数をシリアル化できないと解釈します。簡単な回避策はsource_python
、ループ内で使用することです。
library(doParallel)
library(foreach)
library(parallel)
cl <- makeCluster(detectCores(), type = 'PSOCK')
registerDoParallel(cl)
foreach(i = 1:5) %dopar% {
reticulate::source_python("multip.py")
fsq(i)
}
stopCluster(cl)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加