如何缓存异步协同程序 [英] how to cache asyncio coroutines

查看:32
本文介绍了如何缓存异步协同程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用aiohttp在python3.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和其他一些东西的组合,但似乎都不起作用。

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

推荐答案

可能有点晚,但我已经启动了一个新的包,这可能会有所帮助: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后端:)。

这篇关于如何缓存异步协同程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆