Чем Semaphore отличается от Lock в asyncio?

В asyncio Lock и Semaphore используются для управления доступом к ресурсам, но отличаются по назначению и поведению.

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

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

В asyncio Lock и Semaphore используются для управления доступом к ресурсам, но отличаются по назначению и поведению.

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

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

В asyncio Lock и Semaphore используются для управления доступом к ресурсам, но отличаются по назначению и поведению.

  • Lock — это простой механизм блокировки, который позволяет только одному корутину одновременно получить доступ к ресурсу. Если Lock занят, другие корутины ждут его освобождения.
  • Semaphore позволяет ограничить количество одновременно работающих корутин, получающих доступ к ресурсу, числом, заданным при создании. Например, Semaphore(3) позволит одновременно работать трем корутинам.

Пример:

import asyncio

async def worker(sem, worker_id):
    async with sem:
        print(f"Worker {worker_id} started")
        await asyncio.sleep(1)
        print(f"Worker {worker_id} finished")

async def main():
    sem = asyncio.Semaphore(2)  # максимум 2 корутины одновременно
    await asyncio.gather(*(worker(sem, i) for i in range(5)))

asyncio.run(main())

В этом примере одновременно будут выполняться не более двух воркеров.

Таким образом, Lock — это частный случай семафора с максимальным значением 1.

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

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

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

Подробнее