Привет, я вложил ограничение времени в мой код на Python, который запускает код fortran с функцией. Однако я понял, что функция, которая ставит ограничение времени на другую функцию, не завершает код, просто оставляет ее в фоновом режиме и вместо этого пропускает ее. Я хочу закончить код, когда он превысит ограниченное время. Вот код, который я использую, чтобы ограничить время, которое берется с here.Завершение работы программы в python
def timeout(func, args=(), kwargs={}, timeout_duration=15, default=1):
import signal
class TimeoutError(Exception):
pass
def handler(signum, frame):
raise TimeoutError()
# set the timeout handler
signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
finally:
signal.alarm(0)
return result
Я посмотрел popen.terminate()
, sys.exit()
и atexit.register()
, но не мог понять, как он будет работать с этим кусок кода, который я пытался добавить в части ниже, что я показал в комментарии.
...
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
#add the terminator
finally:
...
ПРИМЕЧАНИЕ: Функция находится внутри для цепи петли, так что я не хочу, чтобы убить всю сессию питона, но просто хочу, чтобы убить программу, что эта функция работает, которая является Фортраном кода и перейти к другому элементу в течение петлевой цепи.
Часть ниже добавлен после того, как некоторые комментарии и ответы:
Я пытался добавить SIGTERM с popen.terminate(), однако она прекратила все питона сессии, которую я просто хочу, чтобы завершить текущий сеанс бега и перейти к другим элементам цикл for. что я сделал это следующим образом:
...
signal.signal(signal.SIGTERM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
popen.terminate()
...
Что вы подразумеваете под * «программа, выполняемая этой функцией» *? Это внешний процесс, запущенный модулем 'subprocess'? Есть ли потоки потомков? Выходит ли процесс, если вы отправляете сигнал SIGTERM? Какова ваша версия Python? Этого должно быть достаточно, чтобы передать параметр 'timeout' в' process.wait() 'и вызывать' process.terminate() 'on TimeoutError, если нет потомков, и процесс выходит из' SIGTERM'. – jfs
@ J.F.Sebastian этот код запускает функцию, которая запускает код fortran, который я хочу ограничить время работы, чтобы сэкономить процессор. Все это funtion оставляет код fortran в фоновом режиме и пропускает к другому элементу in for loop, который накапливается в процессоре после 100 циклов, и позволяет сказать, что я хочу завершить сеанс перед тем, как перейти к другому элементу. Python версии 2.7. – jackaraz
Возможно, связано: [Выполнить команду за указанное время и затем прервать, если время превышает] (http://unix.stackexchange.com/q/23145) – GingerPlusPlus