在父线程中引发异常

时间:2018-03-29 19:39:54

标签: python multithreading

我遇到一个方法调用阻塞而不是释放的问题。不幸的是,关于为什么不能完全解决的错误,所以目前的解决方法是建立一个超时。

我已经尝试通过注册计时器来做到这一点,并让它引发异常以阻止被阻止的呼叫。但是,这会在计时器线程中引发异常,而不是主线程。

现在看起来像这样:

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

有没有办法将此异常传递给父级?

1 个答案:

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