> Как решить проблему race condition на примере системы голосования? (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: HeadHunter
Стек: Python
> Пример ответа
Для решения race condition в системе голосования на Python можно использовать оптимистичную блокировку с атомарными операциями в базе данных. Например, с PostgreSQL и SQLAlchemy:
PYTHONfrom sqlalchemy import Column, Integer, create_enginefrom sqlalchemy.orm import declarative_base, sessionmakerfrom sqlalchemy.exc import IntegrityErrorBase = declarative_base()class Vote(Base):__tablename__ = 'votes'id = Column(Integer, primary_key=True)candidate_id = Column(Integer, nullable=False)count = Column(Integer, default=0)# Атомарное обновление через SQLdef cast_vote(session, candidate_id):result = session.execute("UPDATE votes SET count = count + 1 ""WHERE candidate_id = :candidate_id ""RETURNING count",{"candidate_id": candidate_id})new_count = result.scalar()session.commit()return new_count
Ключевые моменты:
- Используем
UPDATE ... SET count = count + 1- это атомарная операция на уровне БД, исключающая race condition. RETURNINGпозволяет получить обновлённое значение без дополнительного SELECT.- Избегаем паттерна "прочитать-изменить-записать" (read-modify-write), который уязвим к гонкам.
Альтернативный подход - использование Redis с атомарной командой INCR:
PYTHONimport redisr = redis.Redis()def cast_vote_redis(candidate_id):return r.incr(f"vote:{candidate_id}")
Для высоконагруженных систем можно комбинировать: Redis для счётчика (быстро), затем асинхронная запись в основную БД для долговременного хранения.
> Похожие задачи по Python
Какой методологии разработки вы придерживаетесь: Канбан или Скрам?
С какими Python фреймворками кроме Django вы работали?
Как решить проблему гонки при переводе денег между счетами?
Помогает ли транзакция с уровнем изоляции сериализации при race condition?
> Похожие задачи по backend
Какой методологии разработки вы придерживаетесь: Канбан или Скрам?
С какими Python фреймворками кроме Django вы работали?
Как решить проблему гонки при переводе денег между счетами?
Помогает ли транзакция с уровнем изоляции сериализации при race condition?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью