#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