Вы хорошо объяснили природу гонки и важность атомарности. Расскажите, как бы вы реализовали атомарное изменение баланса в Python без использования базы данных?

В одном процессе можно защитить проверку и изменение баланса общим Lock. Важно блокировать весь read-check-write, а не только присваивание; все обращения к состоянию должны соблюдать тот же протокол.

Короткий ответ

Что ответить на собеседовании

В одном процессе можно защитить проверку и изменение баланса общим Lock. Важно блокировать весь read-check-write, а не только присваивание; все обращения к состоянию должны соблюдать тот же протокол.

Подробный разбор

Ответ с пояснениями

В одном процессе можно защитить проверку и изменение баланса общим Lock. Важно блокировать весь read-check-write, а не только присваивание; все обращения к состоянию должны соблюдать тот же протокол.

Для потоков и целых минимальных денежных единиц:

from threading import Lock

class Account:
    def __init__(self, balance):
        self.balance = balance
        self._lock = Lock()

    def withdraw(self, amount):
        if type(amount) is not int or amount <= 0:
            raise ValueError('Invalid amount')
        with self._lock:
            if self.balance < amount:
                raise ValueError('Insufficient funds')
            self.balance -= amount
            return self.balance

Для coroutine применяют asyncio.Lock. Обычный Lock не связывает независимые процессы или серверы, а данные в RAM теряются при сбое. Для реальных денег нужны устойчивое хранение и защита от повторов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее