GOOGLE ADS

четверг, 5 мая 2022 г.

как кэшировать сопрограммы asyncio

Я использую 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бэкэнд:).

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...