我遇到一个方法调用阻塞而不是释放的问题。不幸的是,关于为什么不能完全解决的错误,所以目前的解决方法是建立一个超时。
我已经尝试通过注册计时器来做到这一点,并让它引发异常以阻止被阻止的呼叫。但是,这会在计时器线程中引发异常,而不是主线程。
现在看起来像这样:
from threading import Timer
def timeoutSocket():
raise InterruptedError
socketDeadlockDetector = Timer(DEADLOCK_TIMEOUT, timeoutSocket)
socketDeadlockDetector.start()
# receive and unpack data
try:
packet = server.receive()
except InterruptedError:
print("Interrupted socket receive, continuing")
continue
socketDeadlockDetector.cancel()
server.receive()
是不应该阻止的方法。但是,当我运行它时,socketDeadlockDetector线程会自行中断,而不会影响原始线程。
有没有办法将此异常传递给父级?
答案 0 :(得分:0)
Timer
创建一个运行该函数的线程。提出异常对你没有任何好处,因为那不是需要中断的线程。当您达到超时时,您需要取消其他线程中阻塞的内容。在这种情况下它是一个套接字,所以杀死套接字应该这样做。
import struct
def timeoutSocket():
# enable linger with timeout 0 to send RESET on close
server.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
server.close()