繁体   English   中英

Python SocketServer中的奇怪行为

[英]Strange behaviour in Python SocketServer

我使用从SocketServer.BaseRequestHandler继承的类创建了python套接字服务器,该类重写了setuphandle方法。 当然,在我自己的setup末尾调用SocketServer.BaseRequestHandler.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

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

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

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

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

更新:

我刚刚意识到,由于套接字服务器最大数量的40个连接实际上很少,因此最简单的选择可能是通过systrace运行套接字服务器,也可以使用-f标志来跟踪派生的进程。 例如,您可以启动套接字服务器,同时打开35个连接,然后将systrace连接到正在运行的进程,并再设置5个连接,然后查看systrace报告什么。 在这种情况下,系统调用通常会因systrace中可见的错误而失败,并允许相对容易地找出根本原因。

现在,我真的很想知道如何从源头上错过了!

class ForkingMixIn:

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

    timeout = 300
    active_children = None
    max_children = 40

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

多谢你们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM