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()