👁 В сервисах и фоновых воркерах иногда возникает ситуация, когда функция зависает из-за внешнего API, долгого вычисления или неожиданного состояния данных. Если такие задачи не ограничивать по времени, воркер может навсегда зависнуть и заблокировать обработку очереди.
📝 Ограничение времени выполнения функции через signal
import signal
class TimeoutException(Exception):
pass
def handler(signum, frame):
raise TimeoutException("Функция выполнялась слишком долго")
signal.signal(signal.SIGALRM, handler)
def long_task():
while True:
pass
signal.alarm(2)
try:
long_task()
except TimeoutException as e:
print(e)
finally:
signal.alarm(0)
📌 Как это работает:
signal.alarm()устанавливает таймер, после которого процесс получает сигналSIGALRM.- Обработчик сигнала вызывает исключение
TimeoutException, которое прерывает выполнение функции. - В блоке
finallyтаймер сбрасывается, чтобы он не сработал позже в другом месте программы.
❗️ Такой подход полезен для воркеров, задач обработки данных и скриптов автоматизации, где важно гарантировать, что одна зависшая операция не остановит весь процесс.
tags: #python #разработка




Дискуссия