Запуск makeCluster в рамках withTimeout не работает

Функция makeCluster иногда зависает в моем коде, и ее нужно просто перезапустить, чтобы исправить проблему.

Чтобы сделать это в своем коде, я пытаюсь использовать цикл while плюс функцию withTimeout, чтобы иметь тайм-аут функции makeCluster, если она зависает, и перезапускать себя.

Проблема в том, что когда я создаю свой кластер с помощью withTimeout, я не могу получить к нему доступ позже для своего параллельного лаптопа.

library(parallel)
library(R.utils)
library(pbapply)


 cl = NULL

while( is.null(cl) ){

cl =  withTimeout({makeCluster(4,type = 'FORK')},timeout=3,
                         onTimeout="silent",envir = environment())
}

pblapply(1:3, function(x){x+1},cl = cl)

Сообщение об ошибке, которое я получаю:

Ошибка в сериализации (данные, node $ con, xdr = FALSE): ошибка записи в соединение


person Rafael Velásquez    schedule 11.10.2019    source источник


Ответы (1)


Когда аргумент envir для withTimeout() не установлен, кластеры создаются в .GlobalEnv, и все работает как положено.

library(parallel)
library(R.utils)
library(pbapply)
cl <- NULL
while(is.null(cl)){
    cl <- withTimeout(makeCluster(4, type='FORK'), timeout=3, onTimeout="silent")
}
pblapply(1:3, function(x){x+1}, cl = cl)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
[[1]]
[1] 2

[[2]]
[1] 3

[[3]]
[1] 4

В вопросе вы устанавливаете envir = environment(), который будет разрешать среду вызова функции. Последний отличается от .GlobalEnv и кажется непригодным для создания кластеров. См. также Reval(): изменено поведение, когда аргументу "envir" явно задано значение по умолчанию для получения дополнительной информации о средах.

person Florian    schedule 14.10.2019