Socket.close()不會阻止任何已經在該套接字上運行的阻塞的socket.accept()調用。在關閉的unix套接字上關閉socket.accept()調用
我的python程序中有幾個線程只對已經關閉的unix域套接字運行阻塞的socket.accept()調用。 我想通過使socket.accept()調用停止或 引發異常來殺死這些線程。
我正試圖通過在程序中加載新代碼而不停止程序來做到這一點。 因此,更改產生這些線程或關閉套接字的代碼不是一種選擇。
有沒有辦法做到這一點?
這類似於https://stackoverflow.com/a/10090348/3084431,但是這些解決方案不會工作,爲我的代碼:
- 這一點是不正確的,封閉不會提高在接受一個例外。關閉,但在線程關閉時不能再被調用。
- 我無法連接到此套接字了。插座關閉。
- 帶有accept調用的線程已經在運行,我無法更改它們。
- 同3
爲了澄清,我已經寫了這個問題的一些示例代碼。 此代碼工作在兩個Python 2和Python 3的
import socket
import threading
import time
address = "./socket.sock"
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(address)
sock.listen(5)
def accept():
print(sock.accept())
t = threading.Thread(target=accept, name="acceptorthread")
t.start()
sock.close()
time.sleep(0.5) # give the thread some time to register the closing
print(threading.enumerate()) # the acceptorthread will still be running
我需要的是什麼這個代碼後已經完成,可以以某種方式阻止受體線,我可以運行。
股票套接字行爲有什麼問題?如果「接受」是「已經運行」,則在技術上接受一個連接 - 在您停止接受新的連接之前 - 因此一切都可以。如果你想踢所有現有的客戶,那就是你應該做的。 –
你將永遠無法完成這項工作。你的代碼已經有一個嚴重的競爭條件 - 如果'sock.close()'與'accept'的調用同時執行會發生什麼? Python的套接字對象不是線程安全的 - 當另一個線程訪問它時,它的狀態不能在一個線程中修改。絕對不可能確保'accept'正在運行,而不是即將運行或準備好阻止。所以這*不能*安全地完成,期間。 –
@ivan_pozdeev沒有客戶端,它只是一個阻塞的'accept'函數,它永遠在等待並阻止線程完成。 @DavidSchwartz'sock.close'實際上是在'sock.accept'運行時執行的。問題是套接字現在已關閉,但'sock.accept'仍在運行 – Troido