Вопрос проверяет понимание работы асинхронного планировщика Python (asyncio) при массовом создании корутин, чтобы оценить умение предвидеть проблемы с производительностью и управлением памятью.
Когда вы запускаете множество корутин одновременно в asyncio, они не начинают выполняться физически параллельно, поскольку работают в рамках одного потока и одного цикла событий (event loop). Каждая корутина — это объект, который занимает память и создаёт задачу (Task) для управления своим состоянием. Планировщик цикла событий переключается между активными корутинами, когда они явно отдают управление (через await).
Рассмотрим код, который пытается одновременно выполнить 10 000 HTTP-запросов без ограничений:
import asyncio
import aiohttp
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
# Плохо: создаём 10 000 задач сразу
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, 'http://example.com') for _ in range(10000)]
results = await asyncio.gather(*tasks)
print(f'Получено {len(results)} ответов')
# Запуск
asyncio.run(main())Этот код может вызвать проблемы с памятью и перегрузить сетевой стек. Лучше использовать семафор для ограничения одновременных запросов:
async def main_safe():
semaphore = asyncio.Semaphore(100) # Не более 100 одновременно
async with aiohttp.ClientSession() as session:
async def fetch_with_limit(url):
async with semaphore:
return await fetch_url(session, url)
tasks = [fetch_with_limit('http://example.com') for _ in range(10000)]
results = await asyncio.gather(*tasks)
print(f'Получено {len(results)} ответов')Такие сценарии типичны для веб-скрейперов, мониторинговых систем, микросервисов, обрабатывающих множество входящих соединений, или любых приложений, где требуется высокая конкурентность при ограниченных ресурсах.
Вывод: Запуск большого количества корутин одновременно требует осторожности. Всегда используйте механизмы ограничения параллелизма (семафоры, пулы) и следите за потреблением памяти. Этот подход полезен, когда нужно эффективно обрабатывать множество I/O-операций, не создавая отдельный поток для каждой.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
Python
aiohttp
Ключевые слова
Подпишись на Python Developer в телеграм