Py学习  »  Python

Cachier - 纯Python代码开发的缓存

Python程序员 • 6 年前 • 829 次点击  

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


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/weixin/bmBgp5MUPh
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2011
 
829 次点击