R future:显示进度+等待完成

问题描述 投票:0回答:1

我正在使用 R 包

future
来运行大型计算作业。我想在三个核心之间并行化工作,并为每个核心都有一个单独的进度条。我还希望脚本等到所有三个核心完成后才显示
Done!
消息。

现在,当核心仍在运行时,会出现

Done!
消息。如果我使用像
resolved
这样的函数,那么进度条会显示 0%,直到三个核心完成,然后立即跳到 100%。如何同时更新进度并等待完成?

就上下文而言,我正在将大量文件上传到 AWS S3。

library(shiny)
library(future)
plan(multiprocess)

ui <- fluidPage(
    actionButton("run","Run")
)

server <- function(input, output, session) {
    
    observeEvent(input$run, {
        # Start three parallel processes.
        progress <- list()
        for(k in 1:3) {
            progress[[k]] <- AsyncProgress$new(session, min=1, max=15)
            future({
                for (i in 1:15) {
                    progress[[k]]$set(value = i)
                    Sys.sleep(0.5)
                }
                progress[[k]]$close()
            })
        }
        # Show notification when all three processes are done.
        showNotification("Done!", type = "error") # this runs too early
    })
    
}

shinyApp(ui, server)
r shiny parallel-processing ipc future
1个回答
0
投票

您可以使用 future 返回结果,您最初将其存储在无功值中

NULL
。然后当三个无功值不是
NULL
时显示通知。

library(shiny)
library(future)
library(promises)
plan(multisession)
library(ipc)

ui <- fluidPage(
  actionButton("run","Run")
)

server <- function(input, output, session) {
  
  results <- replicate(3, reactiveVal(), simplify = FALSE)

  observeEvent(input$run, {
    progress <- vector("list", 3)
    lapply(1:3, function(k) {
      progress[[k]] <- AsyncProgress$new(session, message = paste0("job ", k))
      future({
        for(i in 1:15) {
          progress[[k]]$inc(1/15)
          Sys.sleep(0.5)
        }
        progress[[k]]$close()
        18 # result
      }) %...>% (results[[k]])
    })
    NULL
  })
  
  observe({
    resultsList <- list(results[[1]](), results[[2]](), results[[3]]())
    n <- length(Filter(Negate(is.null), resultsList))
    if(n == 3) {
      showNotification("Done!")
    }
  })
}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.