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.