← До фільтрів та технологій

← До списку лабораторних по Python

Python Лабораторна 11: Паралельні HTTP запити

Технологія: Python

Номер лабораторної: 11 · Рівень: middle

Тема: Асинхронний Python: asyncio

Повний опис / сценарій лабораторної:

Meta: навчитися запускати кілька IO операцій паралельно через async і await.



Krok 1. Встановити aiohttp.

Komandi: cd ~/python_lab1; source .venv/bin/activate; pip install aiohttp



Krok 2. Створити файл src/app/async11.py.

Komanda: cd src; touch app/async11.py



Krok 3. Написати асинхронну функцію яка робить один GET запит.

Komanda: printf "import asyncio
import aiohttp

URLS = [
    "https://httpbin.org/delay/1",
    "https://httpbin.org/delay/2",
    "https://httpbin.org/delay/3",
]

async def fetch(session: aiohttp.ClientSession, url: str) -> int:
    async with session.get(url, timeout=5) as resp:
        return resp.status

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, u) for u in URLS]
        results = await asyncio.gather(*tasks)
        print(results)

if __name__ == "__main__":
    asyncio.run(main())
" > app/async11.py



Krok 4. Запустити скрипт і звернути увагу на загальний час виконання.

Komanda: export PYTHONPATH=$(pwd); time python app/async11.py



Krok 5. Переписати main на послідовний варіант для порівняння.

Poyasnennya: зроби версію яка викликає fetch по черзі без asyncio.gather.



Krok 6. Виміряти час послідовного виконання.

Komanda: time python app/async11_seq.py



Krok 7. Додати обробку помилок у fetch з поверненням коду помилки.

Poyasnennya: використати try except навколо session.get.



Krok 8. Занотувати обмеження asyncio для CPU bound задач.



Krok 9. Подумати як би виглядав невеликий async сервіс з aiohttp server.



Krok 10. Mini zvit.

Zavdannya: опиши сценарії де asyncio дає максимальний виграш у твоїй інфраструктурі.