Как работает setTimeLimit в R?

#r #timer

#r #таймер

Вопрос:

Я пытаюсь освоить setTimeLimit() R, и мой опыт привел к нескольким связанным вопросам, поэтому, возможно, основной вопрос: как это действительно работает? (Я evalWithTimeout() также рассматривал R.utils from , и он может немного лучше соответствовать моим целям, но он построен на этой функции.)

Вот ключевые вещи, которые я пытаюсь выяснить:

  1. Как он отслеживает прошедшее время? Т.Е. Кажется, что он вставляется в элемент управления потоком, так как же он это делает? Возможность иметь «фоновые» процессы — это круто, и их можно использовать для отчетности о состоянии, контрольных точках и многом другом.
  2. Могу ли я определить, сколько времени остается до его запуска? Я понимаю, что могу обернуть его и сохранить где-нибудь затраченное и процессорное время, потребляемое примерно в момент вызова (т. Е. Вывода proc.time() ). Но эта функция уже хранит их где-то, и я хотел бы знать, где или, по крайней мере, как определить оставшееся время.
  3. Можно ли заставить его делать что-то полезное, если консоль R простаивает? Возможность мониторинга elapsed.time() и cpu.time() очень полезна. Я хотел бы иметь возможность отслеживать, когда R простаивает, но из-за переделки кажется, что для этого требуется отправить или завершить команду. Более того, простой вывод ошибки не запускает последующее действие. (Возможно, мне нужно уделить больше внимания evalWithTimeout .)
  4. В справочной информации говорится, что он может быть применим к C или Fortran, но примеров не приводится. Любые предложения о том, как это должно быть сделано?

Комментарии:

1. Какой у вас опыт в многопоточном программировании? Насколько я помню, это просто подключается к механизму обратного вызова и, таким образом, запускается каждые пару циклов обработки. Есть примеры использования этого, например, для обновления запроса вашего сеанса терминала R текущим временем — что само по себе глупый пример, но, тем не менее, полезная иллюстрация.

2. Я могу работать с многопоточным программированием. Я предположил, что это обратный вызов, но не пытался это определить. Интересно то, что он не отображается в getTaskCallbackNames() или taskCallbackManager() .

Ответ №1:

Чтобы показать, что setTimeLimit не работает во время вызова функции C.:

 rfunction <- function(){
    repeat{
        x <- rnorm(100);
    }
}

cfunction <- function(){
    x <- eigen(matrix(rnorm(1e6), 1e3));
}

setTimeLimit(3);
system.time(try(rfunction(), silent=TRUE))
system.time(try(cfunction(), silent=TRUE))