sto usando aiohttp fare una semplice richiesta HTTP in Python 3.4 come questo:come memorizzare nella cache asyncio coroutine
response = yield from aiohttp.get(url)
L'applicazione richiede lo stesso URL più e più volte così naturalmente ho voluto mettere in cache esso. Il mio primo tentativo è stato qualcosa di simile:
@functools.lru_cache(maxsize=128)
def cached_request(url):
return aiohttp.get(url)
La prima chiamata a cached_request
funziona bene, ma nelle chiamate successive io alla fine con None
anziché l'oggetto di risposta.
Sono piuttosto nuovo ad asyncio quindi ho provato molte combinazioni del decoratore asyncio.coroutine
, yield from
e alcune altre cose, ma nessuna sembrava funzionare.
Quindi, come funziona la cache delle coroutine?
Non sei sicuro di cosa si intende per il caching un coroutine? per esempio. Salvalo come variabile in modo che tu possa chiamarlo ripetutamente? Salva il risultato, finché il risultato non viene sostituito in un'esecuzione successiva? Oppure ripetere la stessa coroutine in un secondo momento? – shongololo
@shongololo Voglio memorizzare nella cache il risultato della coroutine. – tobib
Non ho familiarità con functools.lru_cache() ma se si desidera semplicemente restituire risultati aggiornati, c'è qualche ragione per cui non si limitano a salvare i risultati aggiornati in una variabile? Tuttavia, quando si utilizza un metodo asincrono (come 'aiohttp.get()') devi guidarlo con qualcosa. Quindi la richiesta in cache deve essere inclusa con '@ asyncio.coroutine'; deve essere chiamato usando 'yield from'; e l'istruzione return dovrebbe essere incorniciata lungo le linee di 'return (yield from aiohttp.get (url))' – shongololo