[英]Strange behaviour in Python SocketServer
我使用从SocketServer.BaseRequestHandler
继承的类创建了python套接字服务器,该类重写了setup
和handle
方法。 当然,在我自己的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)
host
和port
是预定义的,它们没有问题。
服务器工作正常,除非客户端计数达到40。除非此数目之后,否则将不接受任何新连接,所有连接均将被拒绝。 我使用自己系统中的客户端测试python脚本对此进行了检查。 只有40个!
为什么是40 ? 我检查了SocketServer的源代码,没有发现与此相关的任何内容。 我目前对此问题一无所知。 任何,我的意思是真的,任何帮助都是感激的:))
提前致谢
作业系统:CentOS 6.5
这可能与Python无关。 调整您的Linux内核,在测试阶段执行以下操作:
iptables
应用(在测试阶段,可以在确保默认链策略为ACCEPT
之后执行iptables -F
) dmesg
, /var/log/messages
, /var/log/syslog
等 理论上可能与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.