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

OK、誰もこの質問に答えなかったので、私は時間をかけてredis-pyソースコードを調べました(ソースルークを使用してください!)そしてこれが私が見つけたものです。将来誰かが同じ問題に直面した場合に備えて、ここで共有します。

によって返されるRedis()オブジェクト

r = redis.Redis(connection_pool=p)

redis接続を表すものではありません。これは、redisAPIがプロキシされたPythonオブジェクトにすぎません。特定のAPIを呼び出すときは、次のように言います。

r.keys()
内部プロキシは、渡された接続プールを使用して、コマンドとペイロードを作成する前に接続を要求し、プールから取得した接続に対して起動します。次に、接続をプールに戻します。これらのアクションはすべて、APIユーザーに対して透過的です。

つまり、コード内に任意の数のredis.Redis()オブジェクトを作成し、それらを破棄することができます。connection_poolがRedis()オブジェクトの外部で管理されている間、PythonGCはオブジェクトのクリーンアップを処理します。

于 2012-12-02T00:32:36.377 に答える