[英]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.