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.

questionAnswers(2)

yourAnswerToTheQuestion