💡
原文英文,约400词,阅读约需2分钟。
📝
内容提要
本文探讨了如何在asyncio函数中实现缓存。由于async函数返回协程对象,使用functools.cache不适用。作者提出了一种将协程函数包装为可缓存任务的方法,并指出当前缺乏标准库中的简单解决方案。
🎯
关键要点
-
asyncio函数与同步函数的工作方式不同,特别是在缓存方面。
-
functools.cache不适用于async函数,因为async函数返回协程对象。
-
协程对象在调用时立即返回,但只有在await时才会执行。
-
asyncio.Task可以跟踪协程的结果,而不仅仅是协程的状态。
-
可以通过包装协程函数来创建可缓存的任务。
-
作者提出了一种将协程函数转换为可缓存任务的简单方法。
-
虽然有现成的解决方案(如aiocache),但作者认为它们缺乏functools版本的简单性。
-
作者的解决方案使用asyncio原语,易于实现,适合重复使用。
❓
延伸问答
为什么functools.cache不适用于async函数?
因为async函数返回的是协程对象,而functools.cache无法处理这种情况。
如何将协程函数转换为可缓存任务?
可以通过包装协程函数,使用asyncio.create_task来创建可缓存的任务。
asyncio.Task与协程对象有什么不同?
asyncio.Task可以跟踪协程的结果,而协程对象仅跟踪执行状态。
作者对现成解决方案的看法是什么?
作者认为现成的解决方案如aiocache缺乏functools版本的简单性。
如何使用asyncio原语实现缓存?
可以通过将协程函数包装为任务,并结合functools.cache来实现缓存。
为什么需要缓存asyncio函数的结果?
缓存可以提高asyncio函数的性能,避免重复计算相同的结果。
➡️