Может ли консоль R поддерживать фоновые задачи или прерывания (обработка событий)? - PullRequest
8 голосов
/ 03 сентября 2011

Во время работы в консоли R я хотел бы установить фоновую задачу, которая контролирует конкретное соединение, и когда происходит событие, выполняется другая функция (предупреждение).Кроме того, я могу настроить все так, чтобы внешняя функция просто отправляла оповещение R, но, похоже, это та же проблема: необходимо настроить прослушиватель.

Я могу сделать это в выделенном месте.процесс R, но я не знаю, возможно ли это из консоли.Кроме того, меня не интересует прерывание R, если оно вычисляет функцию, но оповещение или прерывание, если консоль просто ожидает ввода.

Вот три варианта использования:

  1. Самый простой возможный пример - просмотр файла.Предположим, у меня есть файл с названием «latestData.csv», и я хочу отслеживать его на предмет изменений;когда это изменяется, myAlert() выполняется.(Можно расширить его, чтобы делать разные вещи, но просто всплывающее уведомление о том, что файл был изменен, полезно.)

  2. Монитор другого типа будет следить за тем, является ли данный компьютерНедостаточно ОЗУ и может выполнить save.image() и завершиться.Опять же, это может быть простой проблемой просмотра файла, созданного внешним монитором, который сохраняет вывод top или какой-либо другой команды.

  3. Другой пример похож на другой недавний SOвопрос, о: R остановит компьютер EC2, на котором он работает .Если предупреждение от другого компьютера или процесса говорит программе сохранить и завершить работу, то возможность прослушивания этого предупреждения была бы великолепной.

В настоящий момент, я подозреваю, есть два способаобработки этого: через Rserve и, возможно, через fork.Если у кого-то есть примеры того, как сделать это с помощью пакета или другого метода, это было бы здорово.Я думаю, что решение любого из этих трех вариантов использования решит все из них, по модулю немного внешнего кода.


Примечание 1: Я понимаю, за этот ответ на другой вопрос SO что R однопоточный, поэтому я подозреваю, fork и Rserve может работать.Тем не менее, я не уверен в целесообразности, если кто-то взаимодействует с терминалом R.Несмотря на то, что REPL R присоединен к входу с консоли, я пытаюсь либо обойти это, либо подражать ему, вот где fork или Rserve может быть ответом.

Примечание 2: Для техзнакомы с обработкой событий / методами обработки событий, которые тоже все решат.Я просто не нашел ничего об этом в R.


Обновление 1: я обнаружил, что в руководстве по написанию расширений R есть раздел, относящийся к обработке событий , в котором упоминаетсяиспользование R_PolledEvents.Это выглядит многообещающе.

Ответы [ 4 ]

9 голосов
/ 08 сентября 2011

Еще одна опция - пакет svSocket .Это не блокировка.

Вот 8-минутное видео с его использованием, которое имеет более 3000 просмотров.В нем показано, как превратить сеанс R в сервер и как отправлять ему команды и получать данные обратно.Это демонстрирует это, даже когда сервер занят;например, если вы запустили длительный процесс и забыли сохранить промежуточные результаты, вы можете подключиться к серверу и получить результаты (до его завершения) с него.

3 голосов
/ 03 сентября 2011

Это зависит от того, хотите ли вы прервать работу на холостом ходу или работать R. Если первое, вы можете подумать об обходе цикла REPL R по умолчанию некоторым слушателем событий, который будет ставить в очередь входящие события и оценивать их. Распространенным вариантом является использование цикла tcl / tk или gtk; Я сделал что-то похожее на libev в моем пакете triggr , который отправляет R дайджест-запросы из сокета.

Последний случай в большинстве случаев безнадежен, если только вы вручную не сделаете вычислительный код для периодического выполнения if(evenOccured) processIt кода.

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

1 голос
/ 08 сентября 2011

Оказывается, что пакет Rdsm также поддерживает это.

С помощью этого пакета можно установить отношения сервер / клиент между различными экземплярами R, каждый из которых является базовым R-терминалом, исервер может отправлять сообщения, включая функции, клиентам.

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

Если процесс сервера, скажем, отслеживает соединение (файл, канал, URL и т. Д.) На регулярной основеОснование и триггер встречаются, он может затем отправить сообщение клиентам.

Хотя основной целью пакета является общая память (как я с ней сталкивался), этот обмен сообщениями работает довольно хорошо для другихТакже и для целей.


Обновление 1: Конечно, для передачи сообщений нельзя игнорировать MPI и пакет Rmpi.Это может сработать, но пакет Rdsm запускает / работает с консолью R, это тот интерфейс, который я искал.Я еще не уверен, что Rmpi поддерживает.

0 голосов
/ 03 сентября 2011

Несколько идей:

  1. Запустите R из скрипта другого языка (это возможно, например, в Perl, используя RSPerl ) и используйте скрипт переносадля запуска прослушивателя.

  2. Другой вариант может состоять в том, чтобы запустить внешнюю (не R) команду (используя system()) изнутри R, которая запустит прослушиватель в фоновом режиме.

  3. Запуск R в пакетном режиме в фоновом режиме либо до запуска R или в отдельном окне.

    Например:

    R --no-save output.out &

    При возникновении события слушатель может отправить соответствующее электронное письмо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...