Вероятно, имеется в виду asyncio.Lock: критическую секцию оформляют через async with, а баланс проверяют и меняют внутри неё. Такой lock действует только в одном процессе.
Вы упомянули async.io.log и контекстный менеджер, это интересно. Можете привести пример кода, как именно вы реализуете такую блокировку для атомарного изменения баланса?
Вероятно, имеется в виду asyncio.Lock: критическую секцию оформляют через async with, а баланс проверяют и меняют внутри неё. Такой lock действует только в одном процессе.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Вероятно, имеется в виду asyncio.Lock: критическую секцию оформляют через async with, а баланс проверяют и меняют внутри неё. Такой lock действует только в одном процессе.
import asyncio
class Wallet:
def __init__(self, balance: int):
self.balance = balance
self.lock = asyncio.Lock()
async def debit(self, amount: int):
if amount <= 0:
raise ValueError('Invalid amount')
async with self.lock:
if self.balance < amount:
raise ValueError('Insufficient balance')
self.balance -= amount
Это учебный in-memory баланс в целых единицах. Для реальных счетов и нескольких workers нужны DB-транзакция, проверка версии/блокировка и идемпотентность; локальный lock не заменяет их.