Асинхронное блестящее программирование - настройка базового примера - PullRequest
0 голосов
/ 18 октября 2018

В качестве упражнения я изменил стандартное приложение Old Faithful Geyser Data для включения асинхронного программирования.Однако его поведение не соответствует моим ожиданиям, основываясь на моем понимании асинхронного программирования. Я подозреваю, что с моей стороны есть фундаментальное недоразумение.

Здесь приложение создает 2 вывода графика, которые идентичны.Один занимает больше времени, чем другой, но настроен на асинхронную работу, другой работает быстро.

server.R

library(future)
library(promises)
library(shiny)
plan(multisession)

function(input, output) {

    bins = reactive({
        future({
            print("I'm slow")
            Sys.sleep(10)
            faithful[, 2]
        }) %...>% 
        {seq(min(.), max(.), length.out = input$slow_bins + 1)}
    })

    output$slow_dist_plot <- renderPlot({
        bins() %...>%
        {hist(faithful[, 2], breaks = ., col = 'darkgray', border = 'white')}

    })

    output$fast_dist_plot = renderPlot({
        print("I'm fast")
        x    <-faithful[, 2] 
        bins = seq(min(x), max(x), length.out = input$fast_bins + 1)
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })

}

ui.R

library(shiny)

fluidPage(
    titlePanel("Old Faithful Geyser Data"),
    sidebarLayout(
        sidebarPanel(
            sliderInput("slow_bins",
                        "Number of slow bins:",
                        min = 1,
                        max = 50,
                        value = 30),
            sliderInput('fast_bins',
                        'fast bins',
                        min = 1,
                        max = 50,
                        value = 30)
        ),
        mainPanel(
            plotOutput("slow_dist_plot"),
            plotOutput("fast_dist_plot")
        )
    )
)

Основано главным образом на моем понимании асинхронного программированияполучено из этого сообщения Rstudio, если два пользователя запускают этот код одновременно, после первоначальной прорисовки двух графиков, если один из пользователей меняет медленные корзины, другой пользователь должен свободно игратьс быстрыми лотками и получайте мгновенные графики, поскольку запрос других пользователей обрабатывается новым процессом.

Однако, когда я на самом деле пытаюсь сделать это с двумя окнами, я вижу, что всякий раз, когда я делаю изменения в медленном лотке,другие окна должны ждать медленных корзин для завершения.Что здесь не так?Мои ожидания неверны или я их неправильно настроил?

1 Ответ

0 голосов
/ 18 октября 2018

Ожидаемое поведение в вопросе является правильным.Однако на одноядерном компьютере число рабочих по умолчанию равно 1 при использовании плана multisession.Выполнение

plan(multisession,workers = 2)

будет иметь ожидаемое поведение.Увеличение номера, вероятно, необходимо для приложения в реальном времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...