запланированные ядра ... не дали результатов, все значения заданий будут затронуты параллельно :: mclapply () в R 4.0.1 - PullRequest
0 голосов
/ 09 июля 2020

Я использую parallel::mclapply() с R 4.0.1 и получаю следующее предупреждение: « запланированные ядра ... не доставили результатов, будут затронуты все значения заданий ».

Вот результат моего расследования: изучив исходный код функции, я понял, что это происходит, когда вектор dr не совсем ИСТИНА. Это означает, что для некоторых ядер второе условие внутри for l oop ниже (is.raw(a)) никогда не выполняется. a - это значение, возвращаемое readChild(), что если необработанные данные возвращены хотя бы один раз, условие будет проверено хотя бы один раз. Итак, я думаю, что readChild() возвращает NULL.

readChild и readChildren возвращают необработанный вектор с атрибутом «pid», если данные были доступны, целочисленный вектор длины один с идентификатором процесса если дочерний элемент завершен, или NULL, если дочерний элемент больше не существует (для readChildren дочерних элементов нет вообще).

Я прошу вас подтвердить или отклонить мои выводы. Наконец, если это правда, каковы возможные причины?

    while (!all(fin)) {
        s <- selectChildren(ac[!fin], -1)
        if (is.null(s)) break # no children -> no hope we get anything (should not happen)
        if (is.integer(s))
            for (ch in s) {
                a <- readChild(ch)
                if (is.integer(a)) {
                    core <- which(cp == a)
                    fin[core] <- TRUE
                } else if (is.raw(a)) {
                    core <- which(cp == attr(a, "pid"))
                    job.res[[core]] <- ijr <- unserialize(a)
                    if (inherits(ijr, "try-error"))
                        has.errors <- c(has.errors, core)
                    dr[core] <- TRUE
                } else if (is.null(a)) {
                    # the child no longer exists (should not happen)
                    core <- which(cp == ch)
                    fin[core] <- TRUE
                }
            }
    }

1 Ответ

0 голосов
/ 10 июля 2020

Это сообщение об ошибке может появиться, когда дочерний процесс умирает / аварийно завершается, например,

> y <- parallel::mclapply(1:2, FUN = function(x) if (x == 1) quit("no") else x)
Warning message:
In parallel::mclapply(1:2, FUN = function(x) if (x == 1) quit("no") else x) :
  scheduled core 1 did not deliver a result, all values of the job will be affected

> str(y)
List of 2
 $ : NULL
 $ : int 2

То, что дочерний процесс полностью умирает, конечно, нехорошо. Это может произойти по нескольким причинам. Я предполагаю, что вы распараллеливаете то, что нельзя распараллеливать. Разветвленная обработка (= mclapply()), как известно, нестабильна с кодом, который, помимо прочего, многопоточным. : Я автор), вы получите более информативное сообщение об ошибке, например

> library(future.apply)
> plan(multicore)

> y <- future_lapply(1:2, FUN = function(x) if (x == 1) quit("no") else x)
Error: Failed to retrieve the result of MulticoreFuture (future_lapply-1) from
the forked worker (on localhost; PID 19959). Post-mortem diagnostic: No process
exists with this PID, i.e. the forked localhost worker is no longer alive.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...