#r #timer
#r #таймер
Вопрос:
Я пытаюсь освоить setTimeLimit()
R, и мой опыт привел к нескольким связанным вопросам, поэтому, возможно, основной вопрос: как это действительно работает? (Я evalWithTimeout()
также рассматривал R.utils
from , и он может немного лучше соответствовать моим целям, но он построен на этой функции.)
Вот ключевые вещи, которые я пытаюсь выяснить:
- Как он отслеживает прошедшее время? Т.Е. Кажется, что он вставляется в элемент управления потоком, так как же он это делает? Возможность иметь «фоновые» процессы — это круто, и их можно использовать для отчетности о состоянии, контрольных точках и многом другом.
- Могу ли я определить, сколько времени остается до его запуска? Я понимаю, что могу обернуть его и сохранить где-нибудь затраченное и процессорное время, потребляемое примерно в момент вызова (т. Е. Вывода
proc.time()
). Но эта функция уже хранит их где-то, и я хотел бы знать, где или, по крайней мере, как определить оставшееся время. - Можно ли заставить его делать что-то полезное, если консоль R простаивает? Возможность мониторинга
elapsed.time()
иcpu.time()
очень полезна. Я хотел бы иметь возможность отслеживать, когда R простаивает, но из-за переделки кажется, что для этого требуется отправить или завершить команду. Более того, простой вывод ошибки не запускает последующее действие. (Возможно, мне нужно уделить больше вниманияevalWithTimeout
.) - В справочной информации говорится, что он может быть применим к 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))