【问题标题】:SimpleXmlRpcServer _sock.rcv freezes after thousands of requestsSimpleXmlRpcServer _sock.rcv 在数千个请求后冻结
【发布时间】:2011-03-17 08:43:54
【问题描述】:

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

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

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

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

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

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

我在这个问题上花了很多时间,现在我开始不知道该怎么办了。任何提示或想法将不胜感激。

【问题讨论】:

    标签: python recv simplexmlrpcserver


    【解决方案1】:

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

    【讨论】:

    • 嗨,Alex,只是想尽快向您报告一切顺利。现在经过 5 天没有任何问题,我敢这么说。捕获实际上处于固定超时状态,而 SimpleXmlRPCServer 没有离开它的默认超时(无)。您通过此建议完全解决了我的问题。然而,两天前我发现 urlib2 遇到了几乎相同的问题。它也冻结在 sockets.py 中(其他 socket.recv 调用,距离前一个调用仅几行)。
    【解决方案2】:

    非常感谢您的快速响应。在我收到它之后,我将超时时间增加到 10 秒。现在一切运行都没有问题,但当然我需要再等一两天才能得到某种确认,但只有在 5 天后我才能确定并且会带着结果回来。我现在看到 140K 的请求已经很顺利了,在这方面有如此艰苦的经验,我至少会再等 200K。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 2016-12-21
      • 2011-09-24
      • 1970-01-01
      • 2022-09-24
      • 2012-05-29
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多