Я пишу это, чтобы получить некоторую помощь в использовании плана (многопроцессный) или плана (многоядерный) и уничтожении длительных процессов в моем блестящем приложении. В приложении есть несколько будущих событий (длительных процессов), которые запускаются при нажатии на соответствующую кнопку actionButton Ниже приведен пример приложения команды future (), используемого в функции сервера в приложении. И я использовал stopMulticoreFuture (fut), чтобы убить процессы.
library(shiny)
library(shinydashboard)
library(promises)
plan(multicore)
library(ipc)
sidebar <- dashboardSidebar(width = 200, sidebarMenu(id = "tabs",
menuItem("File", tabName = "tab1", icon = icon("fas fa-file"))))
body <- tabItem(tabName = "tab1",h2("Input File"),
fluidRow(tabPanel(
"Upload file",
value = "upload_file",
fileInput(
inputId = "uploadFile",
label = "Upload Input file",
multiple = FALSE,
accept = c(".txt")
),
checkboxInput('header', label = 'Header', TRUE)
),
box(
title = "Filter X rows",
width = 7,
status = "info",
tabsetPanel(
id = "input_tab",
tabPanel(
"Parameters",
numericInput(
"nrows",
label = "Entire number of rows",
value = 5,
max = 10
),
actionButton("run", "Analyze"),
actionButton("cancel", "Cancel")
),
tabPanel(
"Results",
value = "results",
navbarPage(NULL,
tabPanel(
"Table", DT::dataTableOutput("res_table"),
icon = icon("table")
)),
downloadButton("downList", "Download")
)
)
)
))
ui <-
shinyUI(dashboardPage(
dashboardHeader(title = "TestApp", titleWidth = 150),
sidebar,dashboardBody(tabItems(body))
))
server <- function(input, output, session) {
file_rows <- reactiveVal()
observeEvent(input$run, {
prog <- Progress$new(session)
prog$set(message = "Analysis in progress",
detail = "This may take a while...",
value = NULL)
file_nrows <- reactive({
return(input$nrows)
})
file_nrows_value <- file_nrows()
file_input <- reactive({
return(input$uploadFile$datapath)
})
file_input_value <- file_input()
fut<- NULL
fut<<- future({system(paste(
"cat",
file_input_value,
"|",
paste0("head -", file_nrows_value) ,
">",
"out.txt"
))
head_rows <- read.delim("out.txt")
head_rows
}) %...>%
file_rows() %>%
finally(~prog$close())
})
observeEvent(file_rows(), {
updateTabsetPanel(session, "input_tab", "results")
output$res_table <-
DT::renderDataTable(DT::datatable(
file_rows(),
options = list(
searching = TRUE,
pageLength = 10,
rownames(NULL),
scrollX = T
)
))
})
output$downList <- downloadHandler(
filename = function() {
paste0("output", ".txt")
}, content = function(file) {
write.table(file_rows(), file, row.names = FALSE)
}
)
observeEvent(input$cancel,{
stopMulticoreFuture(fut)
})
}
shinyApp(ui = ui, server = server)
Когда я нажимаю кнопку «Отмена», пользовательский интерфейс отключается, но консоль отображает приведенное ниже предупреждение, и команда все равно выполняется в консоли.
Warning: Error in stopMulticoreFuture: stopMulticoreFuture only works on multicore futures
Поскольку этот пример представляет собой быстродействующий процесс, команда future () выполняется перед нажатием Cancel
.
В действительности, даже после нажатия «Отмена», команда внутри будущего (длинный процесс) все еще выполняется в консоли после предупреждения, когда пользовательский интерфейс уже отключен.
Приложение в настоящее время работает на MAC с 4 ядрами. Как я могу убить процесс, запущенный в консоли, а просто отключить интерфейс?
В настоящее время я тестирую свое приложение, и было бы здорово иметь экспертный вклад в планирование многопроцессорных / многоядерных процессов и уничтожение процессов, чтобы сделать приложение эффективным для запуска асинхронных процессов среди параллельных пользователей. Последнее приложение будет запущено на машине с Ubuntu с 4 виртуальными процессорами.