【发布时间】:2020-06-22 09:43:48
【问题描述】:
最小的可重现示例:
library("shiny")
ui <- fluidPage(
actionButton("button1", "Run 1"),
actionButton("button2", "Run 2")
)
server <- function(session, input, output) {
cat("session starts\n")
observeEvent(input$button1, {
cat("1 starts\n")
Sys.sleep(15)
cat("1 stops\n")
})
observeEvent(input$button2, {
cat("2 starts\n")
Sys.sleep(15)
cat("2 stops\n")
})
}
shinyApp(ui = ui, server = server)
每个按钮模拟运行一些长时间的 CPU 密集型算法。
- 运行应用程序并在一个浏览器选项卡上打开会话。
- 打开另一个浏览器选项卡,其中包含正在运行的应用程序的另一个会话。
- 在第一个选项卡中启动 Run 1。转到第二个浏览器选项卡并启动 Run 2。
问题: 第二个按钮观察者不会独立启动。它一直等到第一个会话中的第一次运行完成。我认为闪亮的会话是独立的。每个 R 会话中,闪亮如何处理多个闪亮会话?如果多个用户想同时连接到应用程序怎么办?
如何处理同时运行同一个应用的多个用户? 谢谢
【问题讨论】:
-
R 是单线程的,所以默认情况下,请求将排队。 Shiny 团队推出了
promises和futures包,让用户可以进行async操作rstudio.github.io/promises/articles/shiny.html -
我想这是我看到的唯一解决方案。我只是认为闪亮固有地使用其中一个并行化包来处理多个会话。这就提出了一个问题:是否可以使用 'future' 包将整个服务器功能包装在单个 Promise 中?
-
不要低估单线程应用程序的好处,不用担心太多。 Node,
shiny的后端,是单线程的,但它可以在任何给定时间轻松支持 50k 并发用户。 Wrt 在服务器周围使用 Promise,简短的回答可能是否定的。如果您想将应用程序包装在“独立”应用程序中,请查看 docker shinyproxy.io -
我们有机器学习功能,最多可能需要几十分钟。我知道 R 是单线程的,但正如我所说,我假设(错误地 - 我的错)闪亮是并行的。
标签: r session shiny user-management