R shiny session with multiple users connected

元气小坏坏 提交于 2021-02-07 20:02:14

问题


Minimal reproducible example:

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)

Each button simulates running some long cpu-intensive algorithm.

  1. Run the app and open a session on one browser tab.
  2. Open another browser tab with another session for the running app.
  3. Start Run 1 in the first tab. Go to the second browser tab and start the Run 2.

The problem: The second button observer does not start independently. It waits until the first run is finished in the first session. I thought that shiny sessions are independent. How does shiny handle multiple shiny sessions per single R session? What if multiple users want to connect to the application at the same time?

How does one handle multiple users running the same app at the same time? Thanks


回答1:


Limit the number of connections per worker process, i.e. give each user their own R worker process. You can do this by setting the number of concurrent connections allowed per worker process to 1.

If you are deploying your app via shinyapps.io the instructions and further background is here: https://shiny.rstudio.com/articles/scaling-and-tuning.html

If you are deploying to your own shiny server the instructions and further background is here: https://support.rstudio.com/hc/en-us/articles/220546267-Scaling-and-Performance-Tuning-Applications-in-Shiny-Server-Pro

I took your app, added a visible progress bar, and deployed it with the above settings: https://minhealthnz.shinyapps.io/example_parallel/

library("shiny")

ui <- fluidPage(
  actionButton("button1", "Run 1"),
  actionButton("button2", "Run 2")
)

server <- function(session, input, output) {

  observeEvent(input$button1, {

    withProgress(message = 'Run 1', detail = '', value = 0, {
        for (i in 1:15) {
            incProgress(1/15)
            Sys.sleep(0.25)
        }
    })

  })

  observeEvent(input$button2, {

    withProgress(message = 'Run 2', detail = '', value = 0, {
        for (i in 1:15) {
            incProgress(1/15)
            Sys.sleep(0.25)
        }
    })

  })
}

shinyApp(ui = ui, server = server)


来源:https://stackoverflow.com/questions/60618553/r-shiny-session-with-multiple-users-connected

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!