Fazendo várias chamadas com assíncio e adicionando resultado a um dicionário
Estou tendo problemas para seguir adiante na biblioteca Asyncio do Python 3. Eu tenho uma lista de códigos postais e estou tentando fazer chamadas assíncronas para uma API para obter cada cidade e estado correspondente. Posso fazer isso com êxito em sequência com um loop for, mas quero torná-lo mais rápido no caso de uma grande lista de códigos postais.
Este é um exemplo do meu original que funciona
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']}
Esta é minha terrível tentativa não funcional de tentar assíncrona
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
Qualquer ajuda é muito apreciada. Todos os tutoriais que encontrei on-line parecem um pouco exagerados.
Nota: vi alguns exemplos usaremaiohttp
. Eu esperava ficar com as bibliotecas nativas do Python 3, se possível.