簡體   English   中英

Python socketserver-與threading.Lock()交互嗎?

[英]Python socketserver - interaction with threading.Lock()?

我已經使用SocketServer模塊創建了一個小型服務器。 它基本上可以工作,但是我對多個客戶端同時訪問服務器存在一些疑問:

  1. 當使用絕對基本的TCP SocketServer時,即沒有ThreadingMixin或ForkingMixin時-當第二個客戶端在為第一個客戶端完成服務之前嘗試連接到服務器時會發生什么? 第二個連接將被刪除-還是第二個客戶端阻塞?

  2. 我嘗試添加ThreadingMixin。 在那種情況下,我需要用鎖保護服務器代碼中的某個代碼塊

lock = threading.Lock()
with lock:
   # Do stuff here ...
   # ...

# Continue in unlocked scope.

但鎖似乎被忽略了-整個過程都崩潰了。 我也嘗試過使用lock.aquire()和lock.release()來代替-然后似乎無條件地在lock.aquire()上阻塞。 所以在我看來,ThreadingMixin與threading.Lock()不能很好地配合?

編輯:Dan關於使用相同鎖的評論可能是我的鎖問題的關鍵; 我當前的處理程序代碼如下所示:

class MyThreadedHandler(SocketServer.BaseRequestHandler):

   def handle(self):
      lock = threading.Lock()     <-- Each thread a separate lock?!
      with lock:
          # Do serial stuff
      # Continue parallell processing.

所以-我猜每個線程都會鎖定它的個人鎖-並不是很重要!

  1. 當您在BaseServer上調用serve_forever時,該線程專用於處理服務器的事件。 傳入的連接和數據在套接字隊列中等待,直到線程有空閑時間來抓住它們。 因此,新的連接和數據將等待,直到您當前的處理程序返回為止。 如果您有一個阻止的處理程序,則所有傳入的連接和數據將等待,直到完成。

您可以掛起的連接數量有一個適度的限制。 一旦超過該限制,TCP堆棧通常將發送一個RESET來通知另一端離開。 您可以通過覆蓋server_activate並使用更大的值調用listen來更改值:

def server_activate(self):
    socket.listen(32)

謙虛不一定是壞事-可以防止服務器不堪重負。

套接字將排隊的數據量也有一個限制,但是對它的處理要溫和得多。 它只是告知對方接收窗口已滿,請稍等一會。

編輯 2.鎖問題..鎖應該與需要保護的資源(通常是數據,但可能是I / O端口,甚至是寫入文件以確保行不會交叉)相關聯,而不是執行線程。 如果有多個鎖,則必須小心...死鎖很容易寫!

為了回答問題1,當您同步使用服務器(綁定和偵聽)套接字且沒有線程或分支時,新連接將排隊。 他們等到服務器到處處理它們。

當在套接字上調用listen() ,參數是等待被accept()調用的連接隊列的長度,它將一一返回。

如果您的ServerSocket沒有並行處理連接(使用線程或進程),則並發連接必須等待。 如果並發連接太多,則看起來它們將被丟棄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM