Ho difficoltà a completare la libreria Asyncio di Python 3. Ho un elenco di codici di avviamento postale e sto cercando di effettuare chiamate asincrone a un'API per ottenere la città e lo stato di ciascun codice postale corrispondente. Posso farlo con successo in sequenza con un ciclo for, ma voglio renderlo più veloce nel caso di una grande lista di codici di avviamento postale.Esecuzione di più chiamate con asyncio e aggiunta di risultati a un dizionario
Questo è un esempio di mio originale che funziona
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']}
Questo è il mio terribile tentativo non funzionale a cercare di rendere asincrona
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
Qualsiasi aiuto è molto apprezzato. Tutti i tutorial che ho trovato online sembrano essere un po 'troppo in testa.
Nota: ho visto alcuni esempi utilizzare aiohttp
. Speravo di rimanere con le librerie native Python 3 se possibile.
Grazie per questo. Il modo 'aiohttp' è molto più pulito. –
@ anthony-dandrea Se la tua lista di codici postali sarà ENORME, ti consiglio anche di limitare il numero di richieste simultanee a un numero sano come 100 connessioni o così, altrimenti potresti finire per essere bloccato. * Non * parlando per esperienza; -] –