带有超时的python多线程连接

时间:2017-10-27 19:33:04

标签: python multithreading

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

2 个答案:

答案 0 :(得分:1)

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

# 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

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

答案 1 :(得分:0)

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

如果要加入每个子线程然后等待超时完成,那么主线程实际上并不尊重join()的点,即在子线程终止之前停止执行。< / p>

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