почему ошибка 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подключен к консоли.)

  1. Он сообщает «Необработано», несмотря на то, что код обрабатывает его (т.terminated:печатается);
  2. Он сообщает об этом дважды ;

и самое главное ,

  1. Рабочий не освобождается до тех пор, пока я явно не освобожу его, несмотря на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.

0 ответов

Другие вопросы по тегам