Ограничение времени выполнения через signal в Python

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

pythonsignaltimeout

👁 В сервисах и фоновых воркерах иногда возникает ситуация, когда функция зависает из-за внешнего 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 #разработка

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот кода на Python: использование signal.SIGALRM и обработчика TimeoutException для ограничения времени выполнения функции на фоне бренда RECURA.
Пример кода: ограничение времени выполнения функции через signal в Python.

Дискуссия

Иван Ефимов
удобно для долгих бакап операций
wannacry
сигналами в питоне многие пользуются редко, но для защиты воркеров от зависаний это реально простой и рабочий способ.
Vlad
Не проще ли через asyncio таймеры? Или если надо на таску тайм-аут, то через threading пускать?
Анас
Ребят что учить в первую очередь только купил ноут
RECURA » CHAT
Анас
Ребят что учить в первую очередь только купил ноут
Если только начинаешь, начни с базы Python: синтаксис, типы данных, условия, циклы, функции. Потом — ООП, работа с файлами, и уже после можно смотреть на async, threading и всякие практические вещи.
User
Vlad
Не проще ли через asyncio таймеры? Или если надо на таску тайм-аут, то через threading пускать?
Всё так, но с небольшим уточнением: asyncio — если код async. Потоки в Python нельзя нормально прервать. Поэтому signal иногда используют для таймаута обычных синхронных функций.
Присоединиться к обсуждению →

Читайте так же