带超时的 Python 多线程联接

python multi-thread join with timeout

提问人:Tiancheng Liu 提问时间:10/28/2017 更新时间:10/28/2017 访问量:2275

问:

看起来,如果你有一个由 n 个线程组成的循环,并用超时 t 一个接一个地连接它们,那么你花费的实际时间是 n * t,因为一个子线程的开始计算超时是最后一个子线程的结束时间。有没有办法将这个总时间减少到 t 而不是 n*t?

Python 多线程

评论


答:

-1赞 Zachary Cross 10/28/2017 #1

加入线程的原因是调用线程等待加入的线程完成。如果子线程终止(故意终止或由于未处理的异常),则父线程的调用将返回。join()

如果您要加入每个子线程,然后等待超时完成,那么您的主线程实际上并没有遵守 的要点,即停止执行,直到子线程终止。join()

如果您希望子线程在超时时间内完成,则主线程不需要等待完全超时。如果您希望子线程的运行时间超过超时时间,并且不希望父线程在子线程运行时停止执行,那么为什么要让父线程成为子线程呢?join()

评论

0赞 Tiancheng Liu 10/28/2017
我的情况是,我每个子线程都有一个超时。在此超时中,父线程将阻塞并等待子线程。在此超时之后,无论子线程是否终止,父线程都将继续执行。
2赞 pilcrow 10/28/2017 #2

是的,您可以计算绝对超时,并在每次联接之前重新计算剩余的相对超时:

# Join the_threads, waiting no more than some_relative_timeout to
# attempt to join all of them.

absolute_timeout = time.time() + some_relative_timeout

for thr in the_threads:
  timeout = absolute_timeout - time.time()
  if timeout < 0:
    break
  thr.join(timeout)
  if thr.isAlive():
    # we timed out
  else:
    # we didn't

现在,你是否*应该*这样做有点不透明。最好让“守护进程”工作线程通过其他方式传达它们的完成情况:全局状态表、将“完成”消息推送到队列等。