我理解加入一个帖子的目的,我问的是资源的使用。我的具体用例是我有一个长时间运行的进程需要生成许多线程,并在运行期间检查它们是否已终止然后清除它们。主线程等待inotify事件并根据这些线程生成线程,因此它不能阻止join()
调用,因为它需要阻止inotify调用。
我知道使用pthreads,例如,不加入已终止的线程会导致资源泄漏:
PTHREAD_JOIN(3):无法加入可连接的线程(即未分离的线程),会产生“僵尸线程”。避免这样做,因为每个僵尸线程都会消耗一些系统资源,并且当累积了足够的僵尸线程时,将无法再创建新的线程(或进程)。
Python的文档说没有这样的事情,但它也没有指定join()可以被忽略而没有问题,如果许多线程预期在没有在正常操作期间加入的情况下自行结束。
我想知道,我可以简单地选择我的主题列表并执行以下操作:
threads = [thread for thread in threads if thread.is_alive()]
对于每次检查,还是会泄漏?或者我必须做以下事情吗?
alive_threads = list()
for thread in threads:
if thread.is_alive():
alive_threads.append(thread)
else:
thread.join()
threads = alive_threads
答案 0 :(得分:1)
TLDR:不。
Thread.join
只是等待线程结束,它不执行清理。基本上,每个Thread
都有一个在清理线程时释放的锁。 Thread.join
等待锁被释放。
进行了一些小的清理,即Thread.join
删除了锁并设置了一个标记线程为死的标志。但是,这些是内部的,并且还依赖于锁和标志的所有其他公共方法执行。