簡體   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