看起来如果你有一个n个线程的循环并且用超时t逐个连接它们,你实际花费的时间是n * t,因为一个子线程的开始计数超时是最后的结束时间子线程。有没有办法把这个总时间减少到不是n * t?
答案 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()
会成为子进程?