我正在写这篇文章,以寻求使用plan(multiprocess)或plan(multicore)的帮助,并杀死我的闪亮应用程序中长时间运行的进程。该应用程序具有多个未来事件(长时间运行的流程),这些事件通过单击相应的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)
当我单击“取消”按钮时,UI被禁用,但控制台显示以下警告,并且命令仍在控制台中执行。
Warning: Error in stopMulticoreFuture: stopMulticoreFuture only works on multicore futures
由于该示例表示一个快速运行的过程,因此在单击Cancel
之前将执行future()命令。
实际上,即使在单击“取消”后,警告(已禁用UI)后,将来(较长的过程)内的命令仍会在控制台中运行。
该应用程序当前在具有4个内核的MAC上运行。我如何才能杀死在控制台中运行的进程,而不仅仅是禁用UI?
我目前正在测试我的应用程序,希望能在规划多进程/多核和终止进程方面提供专家意见,以使该应用程序在并行用户之间高效地运行异步进程。最终的应用程序将在具有4个虚拟CPU的Ubuntu计算机上运行。
答案 0 :(得分:1)
这里有几个问题:
library(promises)
,plan(multicore)
和library(ipc)
。fut
不是未来,而是%...>%
的承诺,因此stopMulticoreFuture
将无法实现。 ObserveEvent
表达式需要返回承诺以外的内容,否则您的UI将会阻塞。stopMulticoreFuture
只是终止了该进程,因此我无法向您保证它将与创建子进程的system
调用一起使用。您可能需要找出这些的pid值并自己杀死它们。