是否需要连接python中的线程以避免泄漏?

时间:2016-07-08 21:59:33

标签: python multithreading python-multithreading

我理解加入一个帖子的目的,我问的是资源的使用。我的具体用例是我有一个长时间运行的进程需要生成许多线程,并在运行期间检查它们是否已终止然后清除它们。主线程等待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

1 个答案:

答案 0 :(得分:1)

TLDR:不。

Thread.join只是等待线程结束,它不执行清理。基本上,每个Thread都有一个在清理线程时释放的锁。 Thread.join等待锁被释放。

进行了一些小的清理,即Thread.join删除了锁并设置了一个标记线程为死的标志。但是,这些是内部的,并且还依赖于锁和标志的所有其他公共方法执行。