2

一旦线程完成,非守护线程的资源会释放回操作系统吗?即如果主线程没有在这些非守护线程上调用join(),python GC会在它们上调用join并释放线程持有的资源吗?

4

2 回答 2

2

如果您生成一个运行函数的线程,然后该函数在程序结束之前完成,那么是的,一旦线程(a)不再运行,并且(b)不再被任何东西引用,它将被垃圾收集别的。

于 2013-07-26T18:49:06.167 回答
1

一个线程可以被标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个Python程序就退出了。初始值继承自创建线程。可以通过守护进程设置该标志注意 守护线程在关闭时突然停止。它们的资源(例如打开的文件、数据库事务等)可能无法正常释放。如果您希望线程优雅地停止,请将它们设为非守护线程并使用合适的信号诸如事件之类的机制。” -- Python Thread Docs

守护进程由 Python 清理,非守护线程不是 - 你必须发出信号让它们停止。不过,这在执行一些复杂的并行代码时很有用 :) 这确实意味着,如果您使用非守护线程,您可以有随机的虚拟/无用线程供您手动清理。

tl; dr 非守护线程永远不会“完成”,您必须通过您自己的机制或 SIGS 之一(例如 SIGTERM)向它们发出信号以完成。

于 2013-07-26T19:30:07.763 回答