Я хочу прекратить выполнение функции 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 секунд для обработчика сигналов.
Оценка R-кода не освобождает Python GIL. Единственный способ получить скрипт Python для контроля за временем выполнения R-кода - это иметь два процесса.
Вы можете проверить unit тест на rpy2 "testInterruptR()", хотя есть гораздо более элегантные способы реализовать это в приложении. Там SIGINT отправляется в R-процесс с бесконечным циклом.
Попробуйте настроить будильник, а затем введите операцию, в которой вы хотите тайм-аут внутри блоков try catch. Тревога должна вызывать захватывающее исключение. Надеюсь, что это имеет смысл, это работает для меня в любом случае.