我正在使用 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)
您可以使用 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)