如何缓存异步协程

新手上路,请多包涵

我正在使用 aiohttp 在 python 3.4 中发出一个简单的 HTTP 请求,如下所示:

 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 和其他一些东西,但似乎都没有用。

那么缓存协程是如何工作的呢?

原文由 tobib 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 602
1 个回答

也许有点晚了,但我已经启动了一个可能有帮助的新包: 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()))

请注意,作为额外功能,它可以使用 Pickle 序列化将任何 python 对象缓存到 redis 中。如果您只想使用内存,则可以使用 SimpleMemoryCache 后端 :)。

原文由 argaen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进