Как узнать, что параллельный процесс не завис в Python
Python
Middle
СБЕР Центр ИИ
Как узнать, что параллельный процесс не завис в Python
Ответы
Для мониторинга зависших процессов в Python можно использовать несколько подходов:
- **Таймауты** – установить максимальное время выполнения:
```
from multiprocessing import Process
import time
def worker():
time.sleep(10) # Имитация зависания
p = Process(target=worker)
p.start()
p.join(timeout=5) # Ждем 5 секунд
if p.is_alive():
p.terminate() # Принудительно завершаем
```
- **Проверка активности** – регулярный обмен сигналами между процессами через очередь или событие.
- **Внешний мониторинг** – использование специализированных инструментов:
- `psutil` для проверки CPU/памяти
- Системные утилиты (`top`, `htop`)
- Оркестраторы (Celery, Airflow)
- **Декораторы/менеджеры контекста** – обертки с автоматическим таймаутом:
```
from functools import wraps
import signal
class TimeoutError(Exception):
pass
def timeout(seconds):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
signal.signal(signal.SIGALRM, lambda s, f: (_ for _ in ()).throw(TimeoutError()))
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0)
return result
return wrapper
return decorator
```
Критически важно предусмотреть механизм очистки ресурсов при принудительном завершении.