Вы упомянули async.io.log и контекстный менеджер, это интересно. Можете привести пример кода, как именно вы реализуете такую блокировку для атомарного изменения баланса?

Вероятно, имеется в виду asyncio.Lock: критическую секцию оформляют через async with, а баланс проверяют и меняют внутри неё. Такой lock действует только в одном процессе.

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

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

Вероятно, имеется в виду 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 не заменяет их.

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

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

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

Подробнее