У меня блестящее приложение, которое должно выполнять вычисления на нескольких ядрах, обеспечивая обратную связь через индикаторы выполнения. Это работает нормально, пока я не обработаю результаты фьючерсов далее (см. Рабочий пример ниже). Как только я использую результаты впоследствии, индикаторы выполнения не обновляются, пока все фьючерсы не будут сделаны.
Я использую пакеты future
, promises
и ipc
для межпроцессного взаимодействия. Я думаю, что проблема в том, что R хочет продолжить работу с фьючерсами, как только будут получены результаты. Я пытался остановить алгоритм с помощью команд, таких как resolved () или resol (), но без какого-либо прогресса.
library(shiny)
library(future)
library(promises)
library(ipc)
plan(list(multiprocess, sequential))
ui <- fluidPage(
actionButton(inputId = "go", label = "Launch calculation")
)
server <- function(input, output, session) {
observeEvent(input$go, {
x <- list()
N = availableCores()
Tasks = rep(10, N) #Number of sequential tasks per core
progress = list() #A list to maintain progress for each run
resultsvec <- c()
for(j in 1:N){
progress[[j]] = AsyncProgress$new(message = paste("analysis, core ",j))
x[[j]] <- future({
for(l in 1:Tasks[j]){
progress[[j]]$inc(1/Tasks[j])
resultsvec <- append(resultsvec, l)
Sys.sleep(1)
}
resultsvec
progress[[j]]$close()
})
}
result <- lapply(x, value)
#... do stuff with result
})
}
shinyApp(ui = ui, server = server)
Вот функция сервера, при которой индикаторы выполнения обновляются корректно.
server <- function(input, output, session) {
observeEvent(input$go, {
x <- list()
N = availableCores()
Tasks = rep(10, N) #Number of sequential tasks per core
progress = list() #A list to maintain progress for each run
for(j in 1:N){
progress[[j]] = AsyncProgress$new(message = paste("analysis, core ",j))
x[[j]] <- future({
for(l in 1:Tasks[j]){
progress[[j]]$inc(1/Tasks[j])
Sys.sleep(1)
}
progress[[j]]$close()
})
}
})
}