В одном процессе можно защитить проверку и изменение баланса общим Lock. Важно блокировать весь read-check-write, а не только присваивание; все обращения к состоянию должны соблюдать тот же протокол.
Вы хорошо объяснили природу гонки и важность атомарности. Расскажите, как бы вы реализовали атомарное изменение баланса в Python без использования базы данных?
В одном процессе можно защитить проверку и изменение баланса общим 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 теряются при сбое. Для реальных денег нужны устойчивое хранение и защита от повторов.