Mit Asyncio mehrere Anrufe tätigen und einem Wörterbuch ein Ergebnis hinzufügen

Ich habe Probleme damit, die Asyncio-Bibliothek von Python 3 im Voraus einzuschließen. Ich habe eine Liste mit Postleitzahlen und ich versuche, asynchrone Aufrufe an eine API zu senden, um für jede Postleitzahl die entsprechende Stadt und das entsprechende Bundesland zu ermitteln. Ich kann es mit einer for-Schleife erfolgreich nacheinander ausführen, möchte es aber bei einer großen Postleitzahlenliste schneller machen.

Dies ist ein Beispiel für mein Original, das funktioniert

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']}

Dies ist mein schrecklicher, nicht funktionierender Versuch, es asynchron zu machen

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

Jede Hilfe wird sehr geschätzt. Alle Tutorials, auf die ich online gestoßen bin, scheinen mir ein bisschen zu schwindelig zu sein.

Hinweis: Ich habe gesehen, dass einige Beispiele @ verwendaiohttp. Ich hatte gehofft, wenn möglich bei den nativen Python 3-Bibliotheken zu bleiben.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage