Привет, я внедрил ограничение по времени в свой код Python, который запускает код fortran с функцией. Однако я понял, что функция, которая накладывает ограничение по времени на другую функцию, не завершает код, а просто оставляет его в фоновом режиме и вместо этого пропускает. Что я хочу сделать, так это завершить код, когда он превысит ограниченное время. Вот код, который я использую для ограничения времени, взятый из здесь.
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:
...
ПРИМЕЧАНИЕ. Функция находится внутри цепочки циклов for, поэтому я не хочу убивать весь сеанс python, а просто хочу убить программу, которую запускает эта функция, которая является кодом fortran, и перейти к другому элементу в цепочке цикла for.
Часть ниже добавлена после некоторых комментариев и ответов:
Я попытался добавить SIGTERM с помощью popen.terminate(), однако он завершил весь сеанс python, который я просто хочу завершить текущий запущенный сеанс и перейти к другим элементам в цикле for. я сделал следующее:
...
signal.signal(signal.SIGTERM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
popen.terminate()
...