Python多线程调用join()时仅首个线程结束其余持续运行是什么原因?
问题原因分析
- 核心原因是
thread.join()方法是阻塞调用:调用该方法后,主线程会一直等待被调用的目标线程执行结束才会继续往后执行。你的代码中顺序遍历线程列表,第一个线程调用join()后如果本身没有退出逻辑,主线程会永远卡在第一个join()的位置,根本不会执行到后续线程的判断和join()逻辑。 - 其次需要确认你的线程执行函数(
RD.stream、RD.subs_stream、TW.stream、pooling_stream)是否包含无限循环且未设置退出触发条件:如果这些函数本身就是常驻运行的逻辑,没有收到信号就不会主动退出,那join()会永远等不到线程终止,自然会一直卡住。 - 从你给出的运行输出来看,仅打印了第一个线程的停止前日志,没有打印停止后日志,也验证了主线程已经卡在第一个
join()调用的位置,没有继续执行后续代码。
修复建议
- 若这些线程是伴随主线程退出就可以直接终止的后台线程,创建线程时添加
daemon=True参数,主线程退出时会自动终止所有守护线程,不需要手动join()。 - 给线程执行函数添加退出信号判断:比如设置一个全局的退出标志位,线程的循环逻辑里每次都判断标志位状态,如果符合退出条件就主动break跳出循环,保证线程可以正常结束。
- 如果需要顺序等待所有线程退出,不要在循环里每次判断存活就立刻
join(),可以给join()设置超时时间避免永久阻塞,例如args.threads[i].join(timeout=1),超过1秒没退出就继续处理下一个线程,下次循环再判断状态即可。
内容的提问来源于stack exchange,提问作者Omri
相关产品推荐
相关产品推荐

