Вы затронули важный момент с несколькими инстансами. А можете привести пример кода с использованием asyncio.Lock для защиты составной операции внутри одного процесса?

Один общий asyncio.Lock должен охватывать проверку и изменение состояния. Это защищает задачи одного event loop, но не несколько процессов, потоков или независимые экземпляры приложения.

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

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

Один общий asyncio.Lock должен охватывать проверку и изменение состояния. Это защищает задачи одного event loop, но не несколько процессов, потоков или независимые экземпляры приложения.

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

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

Один общий asyncio.Lock должен охватывать проверку и изменение состояния. Это защищает задачи одного event loop, но не несколько процессов, потоков или независимые экземпляры приложения.

Пример локального счётчика:

import asyncio

class Limit:
    def __init__(self, remaining):
        self.remaining = remaining
        self.lock = asyncio.Lock()

    async def take(self):
        async with self.lock:
            if self.remaining <= 0:
                return False
            self.remaining -= 1
            return True

Создавайте и используйте объект в одном loop, не создавайте новый lock на каждый вызов. После внешнего await проверяйте актуальный остаток уже под lock. Для общей квоты нескольких workers нужна атомарная операция внешнего хранилища.

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

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

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

Подробнее