2

使用 redis-py 的 PubSub 类,我有时会遇到以下异常:

Exception in thread listener_2013-10-24 12:50:31.687000:
Traceback (most recent call last):
  File "c:\Python27\Lib\threading.py", line 551, in __bootstrap_inner
    self.run()
  File "c:\Python27\Lib\threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Users\Administrator\Documents\my_proj\my_module.py", line 69, in _listen
    for message in _pubsub.listen():
  File "C:\Users\Administrator\virtual_environments\spyker\lib\site-packages\redis\client.py", line 1555, in listen
    r = self.parse_response()
  File "C:\Users\Administrator\virtual_environments\spyker\lib\site-packages\redis\client.py", line 1499, in parse_response
    response = self.connection.read_response()
  File "C:\Users\Administrator\virtual_environments\spyker\lib\site-packages\redis\connection.py", line 306, in read_response
    response = self._parser.read_response()
  File "C:\Users\Administrator\virtual_environments\spyker\lib\site-packages\redis\connection.py", line 106, in read_response
    raise ConnectionError("Socket closed on remote end")
ConnectionError: Socket closed on remote end

什么会导致这样的事件?
如果我捕捉到这个异常,什么是合理的处理逻辑?重试listen()会徒劳吗?

问而不是简单地尝试的原因是我不知道如何重现这个问题。这种情况很少见,但很有害,因此我必须在此错误再次发生之前创建一些逻辑。

4

2 回答 2

2

可能的来源:

  1. 连接另一端的代码错误导致连接断开
  2. 远程计算机已重新启动或崩溃
  3. 有人正在使用 ipconfig 或类似工具玩弄他们的网络接口
  4. 短暂的网络错误持续了足够长的时间以致连接被断开

最好不要担心为什么会发生这种情况(可能有我没有列出的原因),而是专注于如何处理它。

您可能最好在代码中找到一个位置来添加 try/except 并处理接收到的部分数据,或者忽略接收到的部分数据。

于 2013-11-01T18:01:15.583 回答
0

原因是你的redis服务器不可达,要么是关机,要么是网络故障。发生这种情况时,请检查您的 redis 服务器的状态和网络连接以找出导致这种情况的原因。

然而,这将不可避免地发生。您需要弄清楚如何处理它,即使在重新生成 redis 时要求用户等待也是如此。

于 2013-11-01T18:35:01.220 回答