почему ошибка future_promise является «необработанной» с onRejected
С использованиемfuture_promise
сcatch(.)
(илиthen(onRejected=)
), ошибка по-прежнему помечена как «Необработанная», хотя я думаю, что пытаюсь ее обработать.
library(future)
library(promises)
plan(multicore, workers = 3)
Sys.getpid()
# [1] 1270066
nbrOfFreeWorkers()
# [1] 3
thisproc <- promises::future_promise({
setTimeLimit(elapsed = 2, transient = TRUE)
Sys.sleep(3)
1L
}, seed = TRUE) %>%
promises::then(
function(val) {
message("survived: ", val)
val
}) %>%
catch(
function(error) {
message("terminated: ", substring(conditionMessage(error), 1, 16))
NULL
})
# terminated: Unexpected resul
# Unhandled promise error: Unexpected result (of class ‘NULL’ != ‘FutureResult’) retrieved for MulticoreFuture future (label = ‘<none>’, expression = ‘{; setTimeLimit(elapsed = 2, transient \
# = TRUE); Sys.sleep(3); 1L; }’):
раз это вернулось, то
nbrOfFreeWorkers()
# [1] 2
resetWorkers(plan())
# NULL
nbrOfFreeWorkers()
# [1] 3
(Я использовалsubstring
просто чтобы отличить ошибочную строку, сообщенную моей функцией, и полное сообщение условияcat
подключен к консоли.)
- Он сообщает «Необработано», несмотря на то, что код обрабатывает его (т.
terminated:
печатается); - Он сообщает об этом дважды ;
и самое главное ,
- Рабочий не освобождается до тех пор, пока я явно не освобожу его, несмотря на
then
-цепное функционирование.
Согласно источнику , кажется, что он указан/установлен только в этом одном файле, и он должен устанавливать флаг:
doRejectFinalReason = function(reason) {
private$value <- reason
private$state <- "rejected"
later::later(function() {
lapply(private$onRejected, function(f) {
private$rejectionHandled <- TRUE
f(private$value)
})
private$onRejected <- list()
later::later(~{
if (!private$rejectionHandled) {
# warning() was unreliable here
cat(file=stderr(), "Unhandled promise error: ", reason$message, "\n", sep = "")
}
})
})
}
Я предположил, что посколькуf(private$value)
называется (о чем свидетельствует"terminated:"
сообщение, которое я вставил), затемprivate_rejectionHandled
уже должны были быть обновлены. В этом канале нет других ошибок, поэтому он не должен был сбрасыватьrejectionHandled
флаг.
Кстати, я пытался (безуспешно) позвонитьlater::run_now()
на протяжении всего процесса, чтобы убедиться, что все обещания выполняются, хотя я только копал в темноте (и это не изменило результат).
Кроме того, я могу найтиattributes(thisproc)$promise_impl$.__enclos_env__$private$rejectionHandled
, см. этоFALSE
, и измените его наTRUE
, но мы по-прежнему видим вывод консоли «Unhandled», указывающий на то, что здесь работает что-то еще. https://github.com/rstudio/promises/issues/86#issuecomment-1252420305 связано (или, возможно, одно и то же).
Linux, R-4.2.2, future-1.30.0 (выпущена 1.31.0), promises-1.2.0.1, позже-1.3.0.