# Очередь и исполнители

Документ описывает организацию очереди задач, правила работы воркеров и обновление статусов. Раздел предназначен для сопровождения механизма параллельной обработки индикаторов.

## Структура задач

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

## Работа очереди

- Индикаторы добавляются в общую `asyncio.Queue`, что позволяет масштабировать обработку количеством воркеров, заданных в конфигурации.
- Очередь принимает индикаторы только после успешной проверки доступности провайдеров и подготовки задачи сервисным слоем.
- При остановке сервиса очередь корректно закрывается, чтобы не допустить потери ссылок на активные задания.

## Логика воркеров

- Воркеры извлекают индикаторы, определяют их тип и обращаются к кэшу базы данных перед выполнением сетевых запросов к провайдерам.
- Вызовы к провайдерам выполняются параллельно, при этом ошибки отдельного сервиса не прерывают обработку остальных запросов.
- После получения ответов воркеры сохраняют полезные данные, помечают сбои явным флагом и обновляют прогресс задачи.
- Завершение всех индикаторов переводит задачу в статус `done`; необработанное исключение или сбой БД устанавливает статус `error` и фиксирует текст причины.

## Управление ресурсами

- При остановке воркеры закрывают контексты провайдеров через `AsyncExitStack`, чтобы освободить соединения и файловые дескрипторы.
- Количество одновременных воркеров и объём очереди настраиваются параметрами `worker_count` и ограничениями окружения.
- Жизненный цикл временных задач ограничен временем существования очереди в оперативной памяти; кэшируемые задания сохраняются для повторного чтения через API.
