如何缓存异步协同程序 [英] how to cache asyncio coroutines
本文介绍了如何缓存异步协同程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用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屋!
查看全文