SimpleXmlRpcServer _sock.rcv 在数千次请求后冻结
我正在通过广域网(WAN)处理几个XMLRPC客户端的请求。这个系统在运行的头一天(有时是两天)效果很好,然后在socket.py文件中就卡住了:
data = self._sock.recv(self._rbufsize)
_sock.timeout是-1,_sock.gettimeout是None
在主线程中我没有做什么特别的事情(只是接收XMLRPC调用),还有另外两个线程在和数据库交流。这两个线程运行得很好,并且在这个卡住的情况下也能继续工作(我用WinPdb检查过)。客户端发送的请求都不超过1KB,而且内容也很简单:就是字典里的干净字符串。在两次卡住之间,我处理了成千上万的请求,没有问题。
防火墙是关闭的,机器上没有奇怪的软件等等……
我使用的是Windows XP和Python 2.6.4。我检查过2.6.4和2.6.5之间的区别,没发现什么重要的(或者我错了?)。2.7版本不适合我,因为我会失去MySqlDB的二进制文件。
唯一发生的事情是,由于客户端的网络连接不太好,偶尔会导致socket断开。这种情况每5到10分钟就会发生一次(每2秒就有五个客户端访问服务器)。
我在这个问题上花了很多时间,现在开始不知道该怎么办了。任何提示或想法都会非常感激。
2 个回答
非常感谢你快速的回复。在收到你的信息后,我把超时时间增加到了10秒。现在一切运行得很顺利,不过我还需要再等一两天才能确认结果,真正确认的话还得等到5天后。我现在看到已经有14万次请求成功了,考虑到之前的困难,我至少还会再等20万次请求。
你提到的关于自动调整超时时间的建议(不让系统停下来)听起来也很合理。是不是可以考虑创建一个小类,比如叫做AutoTimeoutCalibrator,然后直接把它放到serial.py里呢?
没错,务实一点是唯一的办法,不然又得浪费10天去搞清楚真正的原因。
再次感谢,我会带着结果回来。
(抱歉,不知道为什么我没法把这个作为回复发到你的帖子里)
在你的操作系统的TCP/IP协议栈中(可能在Python的层面上,但这种可能性较小),到底发生了什么导致这个问题,真的是个谜。不过,作为一个实际的解决办法,我建议你设置一个超时时间,时间要比你预期的请求之间的延迟长(如果你预计每2秒会有一个请求,10秒应该足够了)。如果超时发生,就关闭再重新打开连接。(你可以通过反复试验来调整延迟,以便在不影响正常流量的情况下解决卡顿问题)。我知道在不理解问题的情况下去修补是很麻烦,但在编写、部署和操作真实服务器系统的过程中,务实的态度是生存的必要条件。记得为这个解决办法写上清晰的注释,以便将来维护的人能理解!