Вопрос проверяет понимание механизма ограничения конкурентного доступа к ресурсам в асинхронном программировании на Python с использованием asyncio.
Semaphore в asyncio — это механизм синхронизации, который ограничивает количество корутин, одновременно выполняющих критическую секцию кода. Он полезен, когда нужно контролировать доступ к ограниченным ресурсам, таким как пул соединений с базой данных, количество одновременных HTTP-запросов к API или лимит на использование файловых дескрипторов.
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())Вывод: Semaphore в asyncio — это простой и эффективный способ ограничить конкурентность в асинхронном коде. Его стоит применять, когда необходимо защитить ресурс от перегрузки или соблюсти внешние ограничения, не блокируя выполнение программы целиком.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Python
Node.js
Ключевые слова
Подпишись на Python Developer в телеграм