我已經使用SocketServer模塊來創建一個小型服務器。它主要工作,但我有一個關於多個客戶端同時accesing服務器的一些問題:Python socketserver - 與threading.Lock()交互?
當使用絕對基本的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()一起玩。
編輯:丹關於使用相同的鎖的評論可能是我的鎖定問題的關鍵;我目前的處理程序代碼如下所示:
class MyThreadedHandler(SocketServer.BaseRequestHandler):
def handle(self):
lock = threading.Lock() <-- Each thread a separate lock?!
with lock:
# Do serial stuff
# Continue parallell processing.
所以 - 我想每個線程將鎖定它的個人鎖 - 不是非常多一點!
對於問題#2,您能向我們展示一個我們可以運行的小例子來證明您看到的問題嗎?創建自己的鎖定和鎖定應該沒有問題 - 不應該被忽略,也不應該讓程序崩潰。 (通過崩潰,你的意思是有例外嗎?)除非你正在做一些特殊的需要'acquire()'或'release()'的東西,否則堅持用'lock'。不要忘記鎖定相同的鎖(不是由同一行代碼創建的兩個或多個不同的鎖!) – 2014-11-21 16:35:53