Один общий asyncio.Lock должен охватывать проверку и изменение состояния. Это защищает задачи одного event loop, но не несколько процессов, потоков или независимые экземпляры приложения.
Вы затронули важный момент с несколькими инстансами. А можете привести пример кода с использованием asyncio.Lock для защиты составной операции внутри одного процесса?
Один общий 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 нужна атомарная операция внешнего хранилища.