[英]Python socketserver - interaction with threading.Lock()?
我已經使用SocketServer模塊創建了一個小型服務器。 它基本上可以工作,但是我對多個客戶端同時訪問服務器存在一些疑問:
當使用絕對基本的TCP SocketServer時,即沒有ThreadingMixin或ForkingMixin時-當第二個客戶端在為第一個客戶端完成服務之前嘗試連接到服務器時會發生什么? 第二個連接將被刪除-還是第二個客戶端阻塞?
我嘗試添加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.
所以-我猜每個線程都會鎖定它的個人鎖-並不是很重要!
BaseServer
上調用serve_forever
時,該線程專用於處理服務器的事件。 傳入的連接和數據在套接字隊列中等待,直到線程有空閑時間來抓住它們。 因此,新的連接和數據將等待,直到您當前的處理程序返回為止。 如果您有一個阻止的處理程序,則所有傳入的連接和數據將等待,直到完成。 您可以掛起的連接數量有一個適度的限制。 一旦超過該限制,TCP堆棧通常將發送一個RESET來通知另一端離開。 您可以通過覆蓋server_activate
並使用更大的值調用listen來更改值:
def server_activate(self):
socket.listen(32)
謙虛不一定是壞事-可以防止服務器不堪重負。
套接字將排隊的數據量也有一個限制,但是對它的處理要溫和得多。 它只是告知對方接收窗口已滿,請稍等一會。
編輯 2.鎖問題..鎖應該與需要保護的資源(通常是數據,但可能是I / O端口,甚至是寫入文件以確保行不會交叉)相關聯,而不是執行線程。 如果有多個鎖,則必須小心...死鎖很容易寫!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.