> Как решить проблему race condition на примере системы голосования? (Python)

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

Компании: HeadHunter

Стек: Python

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

Для решения race condition в системе голосования на Python можно использовать оптимистичную блокировку с атомарными операциями в базе данных. Например, с PostgreSQL и SQLAlchemy:

PYTHON
from sqlalchemy import Column, Integer, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
from sqlalchemy.exc import IntegrityError
Base = declarative_base()
class Vote(Base):
__tablename__ = 'votes'
id = Column(Integer, primary_key=True)
candidate_id = Column(Integer, nullable=False)
count = Column(Integer, default=0)
# Атомарное обновление через SQL
def 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

Ключевые моменты:

  1. Используем UPDATE ... SET count = count + 1 - это атомарная операция на уровне БД, исключающая race condition.
  2. RETURNING позволяет получить обновлённое значение без дополнительного SELECT.
  3. Избегаем паттерна "прочитать-изменить-записать" (read-modify-write), который уязвим к гонкам.

Альтернативный подход - использование Redis с атомарной командой INCR:

PYTHON
import redis
r = redis.Redis()
def cast_vote_redis(candidate_id):
return r.incr(f"vote:{candidate_id}")

Для высоконагруженных систем можно комбинировать: Redis для счётчика (быстро), затем асинхронная запись в основную БД для долговременного хранения.

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

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