Sobes.tech
Назад к вопросам
Middle
2

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

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

В 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.