这是我正在做的事情。当我这样做时,redis-py会爆炸。
Python 2.7.3 (default, Aug 1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> p = redis.ConnectionPool()
>>> r = redis.Redis(connection_pool=p)
>>> p.release(r)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 355, in release
if connection.pid == self.pid:
AttributeError: 'Redis' object has no attribute 'pid'
>>>
答案 0 :(得分:18)
好的,因为没有人回答这个问题,我花了一些时间来完成redis-py源代码(使用源luke!),这就是我找到的。我会在这里分享,以防其他人在将来遇到同样的问题。
返回的Redis()对象
r = redis.Redis(connection_pool=p)
不代表redis连接。它只是一个代理redis API的Python对象。当我们调用特定的API时,比如说
r.keys(),内部代理使用传递的连接池在创建命令和有效负载之前请求连接,并触发从池中获取的连接。然后它将连接返回到池。所有这些操作对API用户都是透明的。
最重要的是,您可以在代码中创建任意数量的redis.Redis()对象,然后将其丢弃。 Python GC将处理对象清理,而connection_pool在Redis()对象之外进行管理。