Я использую aiohttp сделать простой запрос HTTP в Python 3.4 вроде этого:как кэшировать asyncio сопрограмм
response = yield from aiohttp.get(url)
Приложение запрашивает тот же URL снова и снова так, естественно, я хотел бы кэшировать. Моя первая попытка была что-то вроде этого:
@functools.lru_cache(maxsize=128)
def cached_request(url):
return aiohttp.get(url)
Первый вызов cached_request
работает нормально, но в последующих вызовах я в конечном итоге с None
вместо объекта ответа.
Я довольно новичок в asyncio, поэтому я пробовал много комбинаций декоратора asyncio.coroutine
, yield from
и некоторых других вещей, но ни один из них не работал.
Как работает кеширование сопрограмм?
Не уверен, что вы имеете в виду кэширования сопрограммы? например Сохраните его как переменную, чтобы вы могли называть ее повторно? Сохранить результат, пока результат не будет заменен при последующем исполнении? Или повторить тот же сопроцесс позже? – shongololo
@shongololo Я хочу кэшировать результат сопрограммы. – tobib
Я не знаком с functools.lru_cache(), но если вы просто хотите вернуть обновленные результаты, то есть ли причина, по которой вы не просто сохраняете обновленные результаты в переменной? Тем не менее, при использовании асинхронного метода (например, 'aiohttp.get()') вам нужно что-то прогнать. Поэтому cached_request должен быть заключен в '@ asyncio.coroutine'; он должен быть вызван с использованием 'yield from'; и оператор return должен быть обрамлен по линиям 'return (yield from aiohttp.get (url))' – shongololo