Сообщать о прогрессе из будущего или из обещания вернуться к главному процессу?

#r #promise #future

Вопрос:

Скажи, что у меня есть это:

 library(future)
plan(multisession)

promise = promises::future_promise({
  for (i in 1:100) {
    Sys.sleep(1)
    ## SOMEHOW REPORT PROGRESS TO MAIN HERE ##
  }
  i    
})
 

В конце концов, это разрешит обещание со значением 100, но как я могу сообщить о каждом i значении, пока работник обещания все еще работает? Каков самый простой способ сделать это?

Я на Windows 10, использую Rstudio.

Спасибо!

Ответ №1:

Не знаю , как это сделать promise , но альтернативой может быть использование future.apply и progressr :

 library(future.apply)
library(progressr)

plan(multisession)

handlers(global = TRUE)
handlers("progress")

my_fcn <- function(xs) {
  p <- progressor(along = xs)
  y <- future_lapply(xs, function(x, ...) {
  Sys.sleep(1)
  p()
  })
}

my_fcn(1:100)

 

Комментарии:

1. Хм, как это возможно, делает ли progresaor какую-то магию под капотом, позволяющую ему связываться с основным потоком? Похоже, это не будет просто работать с любой произвольной функцией, которую я определю снаружи lapply и попытаюсь использовать внутри

2. Также в этом случае, как я узнаю, когда y действительно разрешен?

3. как указано во введении progressr, future имеет встроенную поддержку для progressor . Однако я еще не нашел способа использовать его напрямую с promises . Отсюда мой обходной путь с future.apply

Ответ №2:

Я нашел правильное, но простое решение IPC, которое позволило фьючерсам передавать произвольные сообщения между дочерними и главными процессами, не ограничиваясь progressr и future_lapply:

http://htmlpreview.github.io/?https://github.com/fellstat/ipc/blob/master/inst/doc/shinymp.html