Привет, я внедрил ограничение по времени в свой код 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()
...
subprocess? Существуют ли процессы-потомки? Процесс завершается, если вы отправляете сигнал SIGTERM? Какая у вас версия Python? Должно быть достаточно передать параметрtimeoutвprocess.wait()и вызватьprocess.terminate()по TimeoutError, если потомков нет и процесс завершается наSIGTERM. - person jfs   schedule 31.03.2016subprocess? (Например, библиотекаnumpyвыполняет большое количество кода на Фортране без запуска нового процесса). Чтобы ограничить количество одновременных процессов, см. этот ответ. - person jfs   schedule 01.04.2016subprocess.check_output('./../bin/SPhenoUMSSM ../UMSSM/LH_out_'+mod+' > SPheno_log_'+mod, shell=True)в другой функции для запуска кода на фортране - person jackaraz   schedule 01.04.2016popen? - person jfs   schedule 01.04.2016