当你丢失对Python线程的所有引用时会发生什么?

时间:2016-12-10 20:01:54

标签: python multithreading python-3.x

长话短说......当threading.Thread对象的所有引用都丢失时会发生什么,例如在此函数中:

def myfunc():
    def thread_func():
        while True:
            do_useful_things()
    thethread = threading.Thread(target = thread_func)
    thethread.run()
    return

看起来线程仍在继续,但它表现得很奇怪,我想知道是否会发生奇怪的事情,因为垃圾收集器不正确地删除了它或什么的。

或者线程继续正常,即使产生线程没有主动跟踪它们(我知道threading本身有获取活动线程的方法)?

1 个答案:

答案 0 :(得分:2)

我不是线程专家,但据我所知,如果你在它上面调用thethread.run,它会在当前线程(执行的主线程,从而阻止执行)中执行,然后死亡。在这种情况下,它将在函数结束后收集垃圾,作为该函数内的局部变量。

相反,如果你使用thethread.start(),它会被发送到它自己执行的单独线程。在这种情况下,threading模块中的there's a mapping始终保持对它的引用:

_active = {}    # maps thread id to Thread object

因此,在这种情况下,始终至少有一个对您创建的主题的引用。这最终会在它完成工作后被删除。