Python 在父线程中引发异常

Python 在父线程中引发异常,python,multithreading,Python,Multithreading,我遇到了一个问题,方法调用被阻塞而没有释放。不幸的是,关于为什么的错误并不是完全可以解决的,所以目前的解决办法是在超时时间内构建 我试图通过注册一个计时器来实现这一点,并让它引发一个异常以中断被阻止的呼叫。但是,这会在计时器线程而不是主线程中引发异常 现在看起来是这样的: from threading import Timer def timeoutSocket(): raise InterruptedError socketDeadlockDetector = Timer(DEA

我遇到了一个问题,方法调用被阻塞而没有释放。不幸的是,关于为什么的错误并不是完全可以解决的,所以目前的解决办法是在超时时间内构建

我试图通过注册一个计时器来实现这一点,并让它引发一个异常以中断被阻止的呼叫。但是,这会在计时器线程而不是主线程中引发异常

现在看起来是这样的:

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线程会中断自身,而不会影响原始线程


是否有方法将此异常传递给父级?

计时器创建一个线程来运行该函数。引发异常对您没有任何好处,因为这不是需要中断的线程。当达到超时时,需要取消另一个线程中的阻塞。在这种情况下,它是一个套接字,因此终止套接字就可以了

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()

这是什么操作系统?是否可以让接收代码使用
select
轮询套接字,而不是执行阻塞读取?在某些平台上,您无法唤醒某些类型设备上的阻塞读取(“不间断等待”状态)。当套接字打开时,发送方认为数据已发送,因此关闭了套接字,但无论出于何种原因,接收方(服务器)没有关闭套接字,并挂起,这是一个奇怪的TCP错误。它本身并不是一个套接字超时,所以没有套接字柔术能够像套接字半关闭一样解决它?在任何情况下,如果您的接收器在循环中使用
select.select()
,则它有机会在检查是否有更多数据可从套接字读取之间运行其他代码(例如,检查超时是否已过期)。很公平,我已经了解了这一点,现在我了解了它的工作原理,谢谢!