Исключения Txredisapi. Ошибка времени: превышена максимальная глубина рекурсии - PullRequest
0 голосов
/ 01 февраля 2012

Я пытаюсь удалить все ключи, кроме некоторых в Redis, и получаю следующее исключение:

  ... File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/protocols/basic.py", line 572, in dataReceived
    return self.rawDataReceived(data)
  File "build/bdist.macosx-10.6-intel/egg/txredisapi/protocol.py", line 184, in rawDataReceived

  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/protocols/basic.py", line 589, in setLineMode
    return self.dataReceived(extra)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/protocols/basic.py", line 564, in dataReceived
    why = self.lineReceived(line)
  File "build/bdist.macosx-10.6-intel/egg/txredisapi/protocol.py", line 134, in lineReceived

exceptions.RuntimeError: maximum recursion depth exceeded

Вот код:

@defer.inlineCallbacks
def resetAll(self):
    dict=yield self.factory.conn.keys()        
    for xyz in dict:
        if xyz<>"game" and xyz<>"people" and xyz<>"said":
            val = yield self.factory.conn.delete(xyz)

# ...

if __name__ == '__main__':
    from twisted.internet import reactor 
    conn = txredisapi.lazyRedisConnectionPool(reconnect = True)
    factory = STSFactory(conn)
    factory.clients = []

    print "Server started"
    reactor.listenTCP(11000,factory)
    reactor.listenTCP(11001,factory)
    reactor.listenTCP(11002,factory)
    reactor.run()

Когда я вызываю resetAllФункция с около 725 клавиш в Redis, я получил исключение.С меньшими числами, такими как 200 и т. Д., Он не срабатывает.У кого-нибудь есть идея, что происходит?Спасибо.

1 Ответ

1 голос
/ 03 февраля 2012

Попробуйте это на терминале компьютера Linux / Mac с доступом с правами root и установленными Python и Git:

cd
git clone https://github.com/andymccurdy/redis-py.git redis-py
cd redis-py
sudo python setup.py install

За кулисами Redis-Py использует пул соединений для управления подключения к серверу Redis. По умолчанию каждый экземпляр Redis вы create, в свою очередь, создаст свой собственный пул соединений. Вы можете переопределить это поведение и использовать существующий пул соединений, передавая уже созданный экземпляр пула соединений с connection_pool аргумент класса Redis.

Пример (сохранить как delkeys.py):

#!/usr/bin/python
import redis

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
keys = r.keys()
for key in keys:
    if key<>"game" and key<>"people" and key<>"said":
        r.del(key)

Возьмите это с напоминанием, которое я не проверял, но ваши комментарии могут сформировать окончательное решение, или вы можете перейти отсюда. Всегда проверяйте в Redis-Cli, чтобы быть уверенным.

...