«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу отменить длительные функции Python с использованием таймаутов?

Как я могу отменить длительные функции Python с использованием таймаутов?

Опубликовано 23 декабря 2024 г.
Просматривать:870

How Can I Cancel Long-Running Python Functions Using Timeouts?

Отмена длительных вызовов функций с таймаутами

При выполнении сложных сценариев, включающих функции, которые могут привести к остановке, желательно предусмотреть способ завершить эти функции, если они превысят указанное время выполнения. Это гарантирует, что сценарий не перестанет отвечать на запросы и не будет зависать на неопределенный срок.

В 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