gpt4 book ai didi

r - 异步进程阻塞 R Shiny 应用程序

转载 作者:行者123 更新时间:2023-12-03 10:14:10 25 4
gpt4 key购买 nike

应该可以使用 R 包 futurepromises通过 Shiny 应用程序触发异步(长时间运行)处理,而不会在异步进程在另一个 R 进程中运行时卡住应用程序的其余部分。

看:

https://cran.r-project.org/web/packages/promises/vignettes/intro.html
https://cran.r-project.org/web/packages/promises/vignettes/overview.html
https://cran.r-project.org/web/packages/promises/vignettes/futures.html
https://cran.r-project.org/web/packages/promises/vignettes/shiny.html

我让它在基于 R 脚本的环境中工作,但是当我实现一个具有 2 个功能的简单 Shiny 应用程序时无法让它工作。在异步函数运行时,“非异步”函数总是被阻塞,但情况不应该如此。

我在包 promises 的 GitHub 存储库上发布了相同的问题: https://github.com/rstudio/promises/issues/23

我也将其发布在这里,希望有人可以提供帮助。

问题是:
  • 你能看看下面发布的 Shiny 的应用程序示例,让我知道为什么异步处理会阻塞应用程序吗? (它不应该阻塞)。
  • 理想情况下,您能否提供一个具有非阻塞异步和正常功能(在异步运行时可访问)的应用程序的小示例?

  • 环境

    操作系统 10.12
    $ R --version
    R version 3.4.3 (2017-11-30) -- "Kite-Eating Tree"

    remove.packages("future")
    remove.packages("promises")
    remove.packages("shiny")

    install.packages("future")
    install.packages("devtools")
    devtools::install_github("rstudio/promises")
    devtools::install_github("rstudio/shiny")

    > packageVersion("future")
    [1] ‘1.8.1’
    > packageVersion("promises")
    [1] ‘1.0.1’
    > packageVersion("shiny")
    [1] ‘1.0.5.9000’

    关于 Shiny 包版本的一个侧面问题, https://rstudio.github.io/promises/articles/intro.html说它应该> = 1.1,但即使使用devtools安装,版本仍然是1.0.5 ...。这是一个问题还是文档中有错字?

    First, you can use promises with Shiny outputs. If you’re using an async-compatible version of Shiny (version >=1.1), all of the built-in renderXXX functions can deal with either regular values or promises.



    问题示例

    我已经实现了这个简单的 Shiny 应用程序,灵感来自上面提到的 URL 中的示例。
    Shiny 的应用程序有 2 个“部分”:
  • 触发“长时间运行”异步处理的按钮。这是由函数 read_csv_async 模拟的。它会休眠几秒钟,将 csv 文件读入数据帧。然后 df 呈现在按钮下方。
  • 一个可以随时工作的简单功能(包括触发异步处理时):它包括一个定义要生成的随机值数量的 slider 。然后我们渲染这些值的直方图。

  • 问题是第二个功能(直方图更新)在异步处理发生时被阻止。

    全局.R
    library("shiny")
    library("promises")
    library("dplyr")
    library("future")

    # path containing all files, including ui.R and server.R
    setwd("/path/to/my/shiny/app/dir")

    plan(multiprocess)

    # A function to simulate a long running process
    read_csv_async = function(sleep, path){
    log_path = "./mylog.log"
    pid = Sys.getpid()
    write(x = paste(format(Sys.time(), "%Y-%m-%d %H:%M:%OS"), "pid:", pid, "Async process started"), file = log_path, append = TRUE)
    Sys.sleep(sleep)
    df = read.csv(path)
    write(x = paste(format(Sys.time(), "%Y-%m-%d %H:%M:%OS"), "pid:", pid, "Async process work completed\n"), file = log_path, append = TRUE)
    df
    }

    用户界面
    fluidPage(
    actionButton(inputId = "submit_and_retrieve", label = "Submit short async analysis"),
    br(),
    br(),
    tableOutput("user_content"),

    br(),
    br(),
    br(),
    hr(),

    sliderInput(inputId = "hist_slider_val",
    label = "Histogram slider",
    value = 25,
    min = 1,
    max = 100),

    plotOutput("userHist")
    )

    服务器.R
    function(input, output){
    # When button is clicked
    # load csv asynchronously and render table
    data_promise = eventReactive(input$submit_and_retrieve, {
    future({ read_csv_async(10, "./data.csv") })
    })
    output$user_content <- renderTable({
    data_promise() %...>% head(5)
    })


    # Render a new histogram
    # every time the slider is moved
    output$userHist = renderPlot({
    hist(rnorm(input$hist_slider_val))
    })
    }

    数据.csv
    Column1,Column2
    foo,2
    bar,5
    baz,0

    谢谢!

    最佳答案

    所以这个行为是正常的,查看包开发者在https://github.com/rstudio/promises/issues/23的回复

    摘要:

    在 Shiny 的应用程序中,一个 R 进程可以由多个用户共享。
    如果一个用户提交了一个长时间运行的任务,那么共享相同底层 R 进程的所有其他用户都会被阻止。promises的目标就是避免这种情况。所以promises将防止一个 R 进程中的“用户 session ”之间的阻塞,而不是单个“用户 session ”中的阻塞。

    该软件包的作者提到此功能尚不支持,如果有足够多的人要求,可能会添加它。如果您正在寻找这个,请转到 GitHub 问题并喜欢原始问题 - 这是衡量对新功能的兴趣的方式。

    谢谢!

    关于r - 异步进程阻塞 R Shiny 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165443/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com