Sobes.tech
Junior — Senior
48

Неправильное использование requests в асинхронных корутинах

任务条件

В этом задании необходимо указать, какие ошибки возникают, когда пытаются собрать погодные данные для нескольких городов, комбинируя asyncio и синхронную библиотеку requests. Приведённый пример демонстрирует типичную ловушку: блокирующие HTTP‑запросы выполняются внутри async‑функции, из‑за чего цикл событий теряет преимущества параллельности. Опишите, почему такой код работает медленно, какие исключения могут появиться и как правильно организовать асинхронный доступ к API (например, используя aiohttp или исполняя запросы в пуле потоков).

import asyncio
import requests

async def fetch_weather(city_name):
    with requests.Session() as sess:
        endpoint = "http://api.openweathermap.org/data/2.5/weather"
        params = {'q': city_name, 'APPID': 'your_token_here'}
        with sess.get(url=endpoint, params=params) as resp:
            data = resp.json()
            print(f"{city_name}: {data['weather'][0]['main']}")

loop = asyncio.get_event_loop()
coros = [loop.create_task(fetch_weather(c)) for c in [
    'Moscow', 'St. Petersburg', 'Rostov-on-Don',
    'Kaliningrad', 'Vladivostok', 'Minsk', 'Beijing', 'Delhi'
]]
await_all = asyncio.wait(coros)

loop.run_until_complete(await_all)
loop.close()