我使用从SocketServer.BaseRequestHandler
继承的类创建了一个python套接字服务器,覆盖了setup
和handle
方法。在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)
host
和port
是预定义的,没有问题。
服务器工作正常,除非客户端数达到40个。在此数字之后,将不接受任何新连接,所有连接都将被拒绝。我使用来自我自己系统的客户端测试python脚本检查了这一点。只有40个!
为什么 40 ?我检查过SocketServer的源代码,发现没有任何相关内容。我目前对此问题一无所知。任何,我真的是这个意思,任何帮助都表示赞赏:))
提前致谢
操作系统:CentOS 6.5
答案 0 :(得分:1)
这可能与Python无关。调整您的Linux内核,在测试阶段执行以下操作:
iptables
是否应用了速率限制(在测试阶段,确保默认链策略为iptables -F
后,您可以执行ACCEPT
)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中可见,并且允许相对容易地确定根本原因。
答案 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
属性。
谢谢你们