Отмена длительных вызовов функций с таймаутами
При выполнении сложных сценариев, включающих функции, которые могут привести к остановке, желательно предусмотреть способ завершить эти функции, если они превысят указанное время выполнения. Это гарантирует, что сценарий не перестанет отвечать на запросы и не будет зависать на неопределенный срок.
В Python использование пакета сигналов (доступного в системах UNIX) предлагает решение этой проблемы. Зарегистрировав обработчик сигнала, вы можете установить таймаут для вызова функции. Если функция выполняется дольше указанного времени, вызывается обработчик, позволяющий обработать ситуацию соответствующим образом.
Рассмотрим следующий фрагмент кода:
import signal # Register a signal handler for the timeout def handler(signum, frame): print("Forever is over!") raise Exception("end of time") # Define a function that may run for an indetermined time def loop_forever(): import time while 1: print("sec") time.sleep(1) # Register the signal function handler signal.signal(signal.SIGALRM, handler) # Define a timeout for the function signal.alarm(10) try: loop_forever() except Exception as exc: print(exc) # Cancel the timer if the function returned before timeout signal.alarm(0)
В этом примере мы регистрируем функцию-обработчик для обработки сигнала тайм-аута. Затем мы определяем нашу долгоработающую функцию lo_forever, которая непрерывно печатает сообщение «sec» каждую секунду.
После установки 10-секундного тайм-аута с помощью signal.alarm(10) мы пытаемся выполнить цикл_forever. Если выполнение функции занимает больше 10 секунд, вызывается наш обработчик сигнала, печатающий «Навсегда закончилось!» и создание исключения.
Чтобы обеспечить правильную обработку сценария тайм-аута, важно отменить таймер, если функция возвращает значение до указанного времени. В нашем примере мы вызываем signal.alarm(0), чтобы отменить таймер при возникновении исключения.
Обратите внимание, что пакет сигнала может плохо взаимодействовать с многопоточными средами. Кроме того, если функция перехватывает и игнорирует исключения, возникающие во время таймаута, механизм таймаута может оказаться неэффективным.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3