Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: asyncio, semaphore, concurrency, async/await, python

Для чего используется semaphore в asyncio?

Вопрос проверяет понимание механизма ограничения конкурентного доступа к ресурсам в асинхронном программировании на Python с использованием asyncio.

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

Semaphore в asyncio используется для ограничения количества одновременных корутин, которые могут получить доступ к общему ресурсу или выполнять определенную задачу. Он помогает контролировать нагрузку и предотвращать перегрузку системы. Semaphore работает как счетчик, который уменьшается при захвате и увеличивается при освобождении.

Длинный ответ

Semaphore в asyncio — это механизм синхронизации, который ограничивает количество корутин, одновременно выполняющих критическую секцию кода. Он полезен, когда нужно контролировать доступ к ограниченным ресурсам, таким как пул соединений с базой данных, количество одновременных HTTP-запросов к API или лимит на использование файловых дескрипторов.

Как работает Semaphore

Semaphore содержит внутренний счетчик. При создании ему задается начальное значение (например, 5). Когда корутина вызывает await semaphore.acquire(), счетчик уменьшается на 1. Если счетчик равен 0, корутина приостанавливается до тех пор, пока другая корутина не вызовет semaphore.release(), увеличив счетчик. В asyncio чаще используется контекстный менеджер async with semaphore:, который автоматически захватывает и освобождает семафор.

Пример использования

import asyncio

async def fetch_data(semaphore, url):
    async with semaphore:
        # Имитация HTTP-запроса
        print(f"Запрос к {url}")
        await asyncio.sleep(1)
        print(f"Ответ от {url}")

async def main():
    # Ограничиваем до 3 одновременных запросов
    semaphore = asyncio.Semaphore(3)
    urls = ["url1", "url2", "url3", "url4", "url5"]
    tasks = [fetch_data(semaphore, url) for url in urls]
    await asyncio.gather(*tasks)

asyncio.run(main())

Где применяется

  • Ограничение количества одновременных подключений к базе данных.
  • Контроль числа параллельных HTTP-запросов к внешнему API с rate limit.
  • Управление доступом к общим ресурсам, например, к файлам или сетевым сокетам.

Вывод: Semaphore в asyncio — это простой и эффективный способ ограничить конкурентность в асинхронном коде. Его стоит применять, когда необходимо защитить ресурс от перегрузки или соблюсти внешние ограничения, не блокируя выполнение программы целиком.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

  • Node.js

    Node.js

Ключевые слова

#asyncio

#semaphore

#concurrency

#async/await

#python

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.