Redis PubSub не переподключаетсяPython

Программы на Python
Ответить
Anonymous
 Redis PubSub не переподключается

Сообщение Anonymous »

В настоящее время я разрабатываю оболочку Redis Pubsub для получения экземпляра подписчика. Я пытаюсь сделать его устойчивым к прерываниям соединения.
Согласно документации, «в случае отключения, такого как сетевая ошибка или тайм-аут, объект PubSub повторно подпишется на все предыдущие каналы и шаблоны при повторном подключении». Но у меня это, похоже, не работает.
Вот рабочий пример процесса PubSub:

Код: Выделить всё

>>> import redis
>>> r = redis.Redis(host="172.17.0.2", port=6379)
>>> r.ping()
True
>>> sub = r.pubsub()
>>> sub.subscribe("test")
>>> r.publish("test","test")
1
>>> sub.get_message()
{'type': 'subscribe', 'pattern': None, 'channel': b'test', 'data': 1}
>>> sub.get_message()
{'type': 'message', 'pattern': None, 'channel': b'test', 'data': b'test'}
На этом этапе я отключаю свой экземпляр Redis.

Код: Выделить всё

r.ping()
приводит к ошибке redis.Exceptions.ConnectionError, как и ожидалось.
На этом этапе я перезапускаю свой экземпляр Redis.

Код: Выделить всё

>>> r.ping()
True
>>> r.publish("test","test")
0
>>> sub.get_message()
Traceback (most recent call last):
File "", line 1, in 
File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/client.py", line 3617, in get_message
response = self.parse_response(block=False, timeout=timeout)
File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/client.py", line 3503, in parse_response
if not block and not conn.can_read(timeout=timeout):
File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 734, in can_read
return self._parser.can_read(timeout)
File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 321, in can_read
return self._buffer and self._buffer.can_read(timeout)
File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 231, in can_read
raise_on_timeout=False)
File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 201, in _read_from_socket
raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
redis.exceptions.ConnectionError: Connection closed by server.
Кажется, соединение Redis было правильно включено, но экземпляр PubSub больше не работает. В настоящее время я использую обходной путь.

Код: Выделить всё

>>> sub.reset()
>>> sub.subscribe("test")
>>> sub.get_message()
{'type': 'subscribe', 'pattern': None, 'channel': b'test', 'data': 1}
Я доволен своим обходным решением, но в документации четко указано, что это должно обрабатываться автоматически. Я что-то делаю не так?
Спасибо за ответы!


Подробнее здесь: https://stackoverflow.com/questions/668 ... connecting
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»