← До списку лабораторних по Python
Повний опис / сценарій лабораторної:
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 дає максимальний виграш у твоїй інфраструктурі.