【问题标题】:Raise an exception in parent thread在父线程中引发异常
【发布时间】:2018-09-08 20:53:07
【问题描述】:

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

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

现在看起来像这样:

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

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

【问题讨论】:

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

标签: python multithreading


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2012-10-02
    • 2022-07-31
    • 2020-11-09
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多