Как я могу установить ограничение по времени для кода R, выполняемого с помощью Python (rpy2)?

1

Я хочу прекратить выполнение функции R, вызванной из python (rpy2) через 2 секунды. Вот код python:

signal.signal(signal.SIGALRM, handler)
signal.alarm(2) # set timeout to 2 seconds

# run R code
result = robjects.r('''
      Sys.sleep(10) 
      return("hello")
   ''')

signal.alarm(0) # disable alarm

Это не работает. Я должен подождать 10 секунд для обработчика сигналов.

  • 0
    Это может помочь людям точно знать, как это не работает. Ошибка? Просто игнорирует запрос на паузу на 10 секунд?
  • 0
    Просто игнорирует запрос на паузу на 10 сек. Python ничего не знает о времени выполнения R-кода, когда я выполняю его 5 раз с помощью robjects - сигнал появляется после первого, вызываемого метода- обработчика , но через 10 секунд, а не 2. Я бы хотел убить обработку R-кода через 2 секунды.
Теги:
timeout
rpy2

2 ответа

1
Лучший ответ

Оценка R-кода не освобождает Python GIL. Единственный способ получить скрипт Python для контроля за временем выполнения R-кода - это иметь два процесса.

Вы можете проверить unit тест на rpy2 "testInterruptR()", хотя есть гораздо более элегантные способы реализовать это в приложении. Там SIGINT отправляется в R-процесс с бесконечным циклом.

  • 0
    Спасибо (я не могу нажать «Проголосовать»).
1

Попробуйте настроить будильник, а затем введите операцию, в которой вы хотите тайм-аут внутри блоков try catch. Тревога должна вызывать захватывающее исключение. Надеюсь, что это имеет смысл, это работает для меня в любом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню