3

这就是我正在做的事情。当我这样做时,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'
>>>
4

1 回答 1

21

好的,因为没有人回答这个问题,我花了一些时间浏览了 redis-py 源代码(使用源卢克!),这就是我发现的。我会在这里分享它,以防其他人将来遇到同样的问题。

返回的 Redis() 对象

r = redis.Redis(connection_pool=p)

不代表redis连接。它只是一个代理了 redis API 的 Python 对象。当我们调用特定的 API 时,比如说

r.keys()
内部代理使用传递的连接池在创建命令和有效负载之前请求连接,并针对从池中获得的连接触发。然后它将连接返回到池中。所有这些操作对 API 用户都是透明的。

底线是您可以在代码中创建任意数量的 redis.Redis() 对象并丢弃它们。Python GC 将处理对象清理,而 connection_pool 在 Redis() 对象之外进行管理。

于 2012-12-02T00:32:36.377 回答