Python SocketServer中的奇怪行为

时间:2014-07-28 20:52:48

标签: python sockets

我使用从SocketServer.BaseRequestHandler继承的类创建了一个python套接字服务器,覆盖了setuphandle方法。在cource中,SocketServer.BaseRequestHandler.setup在我自己setup的末尾被调用。

这是我的服务器类

class MyServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
    timeout = 30

典型的分叉套接字服务器。

以下是我运行服务器的方法

while True:
        try:
            server = MyServer((host, port), MyRequestHandler)
            print('Server listening on', (host, port))
            server.timeout = 300  # seconds
            server.serve_forever()
        except:
            print('Error with server, retrying in 5 seconds...')
            print(sys.exc_info())
            sleep(5)

hostport是预定义的,没有问题。

服务器工作正常,除非客户端数达到40个。在此数字之后,将不接受任何新连接,所有连接都将被拒绝。我使用来自我自己系统的客户端测试python脚本检查了这一点。只有40个!

为什么 40 ?我检查过SocketServer的源代码,发现没有任何相关内容。我目前对此问题一无所知。任何,我真的是这个意思,任何帮助都表示赞赏:))

提前致谢

操作系统:CentOS 6.5

2 个答案:

答案 0 :(得分:1)

这可能与Python无关。调整您的Linux内核,在测试阶段执行以下操作:

理论上可能与Python相关的一件事是SO_REUSEADDR

http://www.unixguide.net/network/socketfaq/4.5.shtml

检查是否为插座设置了它。

<强>更新

我刚刚意识到,由于套接字服务器最大的40个连接实际上非常低,最简单的选项可能是通过systrace运行套接字服务器,只需使用-f标志来跟踪分叉过程也是如此。你可以,例如启动套接字服务器,打开35个并发连接,然后将systrace连接到正在运行的进程并设置另外5个连接,并查看systrace个报告。在这种情况下,很多时候系统调用失败,错误在systrace中可见,并且允许相对容易地确定根本原因。

答案 1 :(得分:0)

我现在真的知道我在源头上错过了这个!

class ForkingMixIn:

    """Mix-in class to handle each request in a new process."""

    timeout = 300
    active_children = None
    max_children = 40

是的,现在我看到了max_children属性。

谢谢你们