Параллельная обработка в R Shiny, вызов скрипта Python

Я пытаюсь выполнить параллельную обработку в R Shiny, параллельная задача, которую я хочу выполнить, - это вызов скрипта Python. Однако он не работает и не может вернуть результат из Python в R. Ниже приведен пример кода R Shiny и Python. Приложение.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

person jacob mathew    schedule 26.06.2018    source источник
comment
Откуда source_python? Что значит не работает?   -  person Ralf Stubner    schedule 26.06.2018
comment
вызов функции python не выполняется, он дает ошибку в результате строки ‹- foreach (i = 1: 5) % dopar% fsq (i)   -  person jacob mathew    schedule 26.06.2018
comment
source_python должен ссылаться на скрипт python, он исходит из пакета reticulate. сообщение об ошибке: Ошибка в unserialize (socklist [[n]]): ошибка чтения из соединения   -  person jacob mathew    schedule 26.06.2018


Ответы (1)


Сообщение об ошибке не зависит от 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)     

Я интерпретирую это так, что нельзя сериализовать функцию Python, как можно сериализовать функцию R. Простой обходной путь — использовать 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)     
person Ralf Stubner    schedule 26.06.2018
comment
это сработало, спасибо! да, имеет смысл иметь полный код для параллельной задачи внутри цикла, особенно когда он ссылается на внешний скрипт/функцию - person jacob mathew; 27.06.2018
comment
Чтобы расширить ответ Ральфа Штубнера: функция fsq R опирается на объект типа externalptr. Такие объекты нельзя сериализовать/десериализовать, если разработчик таких объектов не реализовал для этого поддержку. (Мне еще предстоит увидеть пример этого.) - person HenrikB; 27.06.2018