Я использую aiohttp, чтобы сделать простой HTTP-запрос в python 3.4 следующим образом:
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
и некоторых других вещей, но ни одна из них не сработала.
Так как же работает кэширование сопрограмм?
Решение проблемы
Может быть, немного поздно, но я запустил новый пакет, который может помочь: https://github.com/argaen/aiocache. Вклады/комментарии всегда приветствуются.
Пример:
import asyncio
from collections import namedtuple
from aiocache import cached
from aiocache.serializers import PickleSerializer
Result = namedtuple('Result', "content, status")
@cached(ttl=10, serializer=PickleSerializer())
async def async_main():
print("First ASYNC non cached call...")
await asyncio.sleep(1)
return Result("content", 200)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
print(loop.run_until_complete(async_main()))
print(loop.run_until_complete(async_main()))
print(loop.run_until_complete(async_main()))
print(loop.run_until_complete(async_main()))
Обратите внимание, что в качестве дополнения он может кэшировать любой объект Python в Redis, используя сериализацию Pickle. Если вы просто хотите работать с памятью, вы можете использовать SimpleMemoryCache
бэкэнд:).
Комментариев нет:
Отправить комментарий