🚀 Синхронность vs Асинхронность: Ускоряем код в 10 раз Представьте, что вы стоите в очереди в Макдональдс.
Представьте, что вы стоите в очереди в Макдональдс.
🐢 Синхронный подход (как requests):
Кассир принимает ваш заказ, уходит на кухню, ждет, пока пожарится картошка, наливает колу, отдает заказ вам и только потом обращается к следующему человеку в очереди. Медленно? Ужасно медленно!
⚡️ Асинхронный подход (как aiohttp):
Кассир принимает заказ, кричит на кухню "Свободная касса!" и сразу берет заказ у следующего, пока ваш готовится. Работа идет параллельно.
В Python для этого используется библиотека aiohttp и ключевые слова async / await.
Сравним на практике:
Допустим, нам нужно скачать 10 страниц.
import asyncio
import aiohttp
import time
# Функция для одного запроса
async def fetch_page(session, url):
async with session.get(url) as response:
return response.status
async def main():
urls = ["https://google.com" for _ in range(10)] # 10 запросов
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
# Создаем задачи, но еще не запускаем их ожидание
tasks.append(fetch_page(session, url))
# Запускаем все задачи одновременно!
await asyncio.gather(*tasks)
start = time.time()
# Запуск асинхронного цикла
asyncio.run(main())
print(f"Время выполнения: {time.time() - start:.2f} сек")
Результат:
Если requests будет делать это ~10 секунд (по 1 сек на запрос), то aiohttp справится за ~1.2 секунды. Он просто отправит все 10 запросов разом и будет ждать ответы.
🛠 Установка:
pip install aiohttp
⚠️ Важно: Не используйте это для атак на сайты (DDoS). Сервер может забанить вас за слишком большое количество запросов в секунду.
Сохраняй, пригодится для парсинга больших объемов данных! 🔥
Подписывайтесь на канал 👉 @python_of