Выполнение нескольких вызовов с помощью asyncio и добавление результата в словарь
У меня возникли проблемы с переносом в библиотеку Asyncio в Python 3. У меня есть список почтовых индексов, и я пытаюсь сделать асинхронные вызовы API, чтобы получить каждый почтовый индекс, соответствующий городу и штату. Я могу сделать это успешно в последовательности с циклом for, но я хочу сделать это быстрее в случае большого списка почтовых индексов.
Это пример моего оригинала, который работает
import urllib.request, json
zips = ['90210', '60647']
def get_cities(zipcodes):
zip_cities = dict()
for idx, zipcode in enumerate(zipcodes):
url = 'http://maps.googleapis.com/maps/api/geocode/json?address='+zipcode+'&sensor=true'
response = urllib.request.urlopen(url)
string = response.read().decode('utf-8')
data = json.loads(string)
city = data['results'][0]['address_components'][1]['long_name']
state = data['results'][0]['address_components'][3]['long_name']
zip_cities.update({idx: [zipcode, city, state]})
return zip_cities
results = get_cities(zips)
print(results)
# returns {0: ['90210', 'Beverly Hills', 'California'],
# 1: ['60647', 'Chicago', 'Illinois']}
Это моя ужасная нефункциональная попытка сделать его асинхронным
import asyncio
import urllib.request, json
zips = ['90210', '60647']
zip_cities = dict()
@asyncio.coroutine
def get_cities(zipcodes):
url = 'http://maps.googleapis.com/maps/api/geocode/json?address='+zipcode+'&sensor=true'
response = urllib.request.urlopen(url)
string = response.read().decode('utf-8')
data = json.loads(string)
city = data['results'][0]['address_components'][1]['long_name']
state = data['results'][0]['address_components'][3]['long_name']
zip_cities.update({idx: [zipcode, city, state]})
loop = asyncio.get_event_loop()
loop.run_until_complete([get_cities(zip) for zip in zips])
loop.close()
print(zip_cities) # doesnt work
Буду признателен за любую оказанную помощь. Все учебники, с которыми я сталкивался в Интернете, кажутся мне немного сложными.
Примечание: я видел несколько примеров использованияaiohttp
, Я надеялся придерживаться нативных библиотек Python 3, если это возможно.