> Какие варианты реализации взаимодействия фронтенда и бэкенда для долгих задач с отображением прогресса (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: JEDai

Стек: Python

> Пример ответа

Для долгих задач с отображением прогресса на стеке Python (бэкенд) и фронтенде есть несколько основных подходов:

  1. Polling (опрос) - фронтенд периодически отправляет GET-запросы к эндпоинту, возвращающему статус задачи. Бэкенд хранит состояние (например, в Redis или БД). Просто реализовать, но создает избыточную нагрузку.

  2. WebSocket - постоянное двустороннее соединение. Бэкенд отправляет сообщения с прогрессом (например, через websockets или channels в Django). Эффективно для реального времени, но требует поддержки на уровне инфраструктуры.

  3. Server-Sent Events (SSE) - односторонний поток от сервера к клиенту. Используйте sse-starlette для FastAPI или django-sse-events. Легче WebSocket, подходит для прогресса.

  4. Фоновые задачи с очередями - Celery + Redis/RabbitMQ. Бэкенд запускает задачу, возвращает ID, а фронтенд опрашивает статус или получает обновления через WebSocket/SSE. Пример на FastAPI:

    PYTHON
    from celery import Celery
    from fastapi import FastAPI
    from pydantic import BaseModel
    app = FastAPI()
    celery_app = Celery('tasks', broker='redis://localhost:6379/0')
    @celery_app.task(bind=True)
    def long_task(self, duration: int):
    for i in range(duration):
    self.update_state(state='PROGRESS', meta={'current': i, 'total': duration})
    time.sleep(1)
    return {'status': 'done'}
    @app.post('/start-task')
    async def start_task(duration: int):
    task = long_task.delay(duration)
    return {'task_id': task.id}
    @app.get('/task-status/{task_id}')
    async def get_status(task_id: str):
    task = long_task.AsyncResult(task_id)
    if task.state == 'PENDING':
    return {'state': 'PENDING'}
    elif task.state == 'PROGRESS':
    return {'state': 'PROGRESS', 'progress': task.info}
    elif task.state == 'SUCCESS':
    return {'state': 'SUCCESS', 'result': task.result}

    Фронтенд опрашивает /task-status/{task_id} каждые 1-2 секунды.

  5. Гибридный подход - используйте WebSocket для реального времени и polling как fallback. Например, при старте задачи открываете WebSocket, а если он разорван - переключаетесь на опрос.

Рекомендую для простоты начать с polling + Celery, а для высокой нагрузки - перейти на WebSocket или SSE.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью