Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
为Python函数提供持久,无故障,本地和跨机器的缓存。
安装
通过以下代码安装cachier:
特性
1.完全用Python开发
2.兼容Python 2.7+和Python 3.5+。
3.支持Linux,OS X和Windows。 在Linux和OS X系统上测试过。
4.简单的界面。
5.为缓存值定义“保存期限”。
6.本地缓存使用pickle文件。
7.使用MongoDB进行跨机器缓存。
8.线程安全。
Cachier不是:
1.作为一个暂时缓存。 Python的@lru_cache更好。
2.特别快。这里的含义是替换超过一秒钟的函数调用,(开销约为1毫秒)
未来添加的特性:
1. S3核心
2. 多核缓存
使用
用于包装函数的位置和关键字参数必须是可散列的(即Python的不可变内置对象,而不是可变容器)。 另外,请注意,由于作为用户定义类的实例的对象是可散列的,但是它们之间相比却不相等(它们的哈希值就是其id),所以相同对象在不同上下文中将不会产生相同的密钥。
设置Cache
您可以为您的函数添加默认的基于pickle的持久缓存 - 这意味着它将在跨越不同的Python内核调用的包装函数之间保持一致 - 通过使用cachier装饰器进行装饰(注意“()”!)。
重置Cache
Cachier包装器为每个包装函数添加一个clear_cache()函数。 只需调用此方法,就能重置包装函数的缓存,:
Cache保存期限
1. 设置保存期限
可以通过向stale_after参数提供相应的timedelta对象,来设置缓存的函数返回值的保存期限:
现在,当找到与给定参数匹配的缓存值时,检查该缓存值的初始生成时间; 如果超过stale_after设置的保存期限,则再次运行该函数,并且缓存返回的新值。
这对于依赖于动态数据源的冗长计算非常有用。
2. 模糊保存期限
有时会希望函数在遇到过时的结果时重新计算,但是如果不那么关键,那么不需要等待它完成。 在这种情况下,可以将next_time设置为True,使函数在单独的线程中触发重新计算,但返回当前缓存值:
当计算正在进行中,其他函数调用不会触发冗余计算。
针对具体函数的调用参数
Cachier不只是在装饰器调用中,还可以在包装函数的调用中接受几个关键字参数,以便修改特定函数调用的行为。
1.Ignore Cache参数
通过将ignore_cache = True传递给函数调用,可以让cachier忽略特定函数调用的任何现有缓存。 缓存值既不会被检查也不会更新为新值。
2.Overwrite Cache参数
通过将overwrite_cache = True传递给函数调用,可以使cachier对于特定的函数调用覆盖现有的缓存条目(如果存在)。 缓存值将不被检查,但将使用新的返回值进行更新。
3.Verbose Cache Call参数
通过将verbose_cache = True传递给函数调用,可以通过cachier打印出具体调用逻辑的详细说明。 这在不确定函数调用结果是否被返回的时候很有用。
Cachier内核
1.Pickle内核
Cachier的默认内核是基于pickle的,这意味着每个函数将其缓存存储为~/.cachier目录中的单独pickle文件。 当然,这种缓存既是机器特定的,也是用户特定的。
如果代码只是在单线程环境中使用,可以通过下面方法优化基于pickle的缓存:
这将阻止每次读取缓存时都读取缓存文件,从而加快处理速度,然而也使线程间无法交互(该代码仍然是线程安全的,但不同的线程有时会有不同版本的缓存,而且有时会引起不必要的函数调用)。
2.MongoDB核心
可以通过将mongetter分配给具有写入权限的pymongo.Collection对象的可调用函数来设置基于MongoDB的缓存:
虽然相比会慢些,但这允许你有一个跨机器的缓存。 使用这个功能需要安装pymongo python包。
贡献代码
软件包作者和当前维护者是Shay Palachy(shay.palachy@gmail.com); 欢迎你来帮助他贡献代码。
1.安装开发环境
通过如下方式克隆:
以开发模式安装测试依赖项:
2.允许代码测试
通过以下方式运行测试:
3.增加文档
该项目使用numpy docstring约定(https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt)编写文档,之所以选择这种约定,因为它们是最广泛传播的约定,都被诸如Sphinx等常用工具支持,并且可读性强(当然是我个人的想法)。 当为此项目的代码添加文档时,请遵循该约定。(https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt)。
英文原文:https://github.com/shaypal5/cachier
译者:lj1981