数以千计的请求后,SimpleXmlRpcServer _sock.rcv冻结

时间:2010-07-17 14:51:34

标签: python recv simplexmlrpcserver

我正在通过WAN处理来自多个XMLRPC客户端的请求。这个东西很适合,比方说,一天(有时是两天),然后在socket.py冻结:

data = self._sock.recv(self._rbufsize)

_sock.timeout为-1,_sock.gettimeout为None

我在主线程中没有什么特别的(只接收XMLRPC调用),还有另外两个线程与DB通信。这两个线程都可以正常工作并在此块中存活(使用WinPdb进行检查)。客户端发送的请求不超过1KB,并且没有任何特殊内容:字典中的字符串很干净。在两次封锁之间,我毫无问题地提供了数万个请求。 防火墙关闭,同一台机器上没有奇怪的软件等......

我使用的是Windows XP和Python 2.6.4。我检查了2.6.4之间的差异。和2.6.5,并没有发现任何重要的事情(或者我错了吗?)。 2.7版本不是一个选项,因为我会想念MySqlDB的二进制文件。

由互联网连接较差的客户端不时发生的唯一事情是套接字断开。这种情况每5-10分钟发生一次(每2秒只有五个客户端访问服务器)。

我花了很多时间在这个问题上,现在我开始失去任何想法该做什么。任何提示或想法都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

你的操作系统的TCP / IP堆栈中究竟发生了什么(可能在顶部的python层中,但这不太可能)导致这是一个谜。作为一个实际的解决方法,我设置的超时时间超过了您期望的请求之间的延迟(如果您希望每2秒发出一次请求,则10秒应该足够),如果发生请求,关闭并重新打开。 (校准在不通过反复试验中断正常流量的情况下解决冻结所需的延迟)。我知道,在不理解问题的情况下修复修复是不愉快的,但在编写,部署和操作实际服务器系统的世界中,对这些事情的实用性是必要的生存特征。请务必准确地为未来的维护人员评论解决方法!

答案 1 :(得分:0)

非常感谢快速反应。我收到它后立即将超时增加到10秒。现在它都运行没有问题,但当然我需要再等一两天才能得到确认,但只有在5天之后我才会确定并且会回来结果。我现在看到已经有140K的请求进展顺利了,在这个问题上有这么难的经验我至少会等待200K。

你提出的关于自动调整超时(不放下系统)的建议听起来也很合理。正确的方法是创建一个小类(例如AutoTimeoutCalibrator)并将其直接嵌入到serial.py中吗?

是的 - 实用是唯一的方法,不用再花10天时间试图找出背后的真正原因。

再次感谢,我将回复结果。 (抱歉,但出于某种原因,我无法将其发布为对您帖子的回复)