Python 线程如何共享对实例的引用?

Python 线程如何共享对实例的引用?,python,Python,我试图通过运行一些示例来了解Python多线程,下面是一个我不太了解其行为的示例 #!python3.6 import threading import time class ThreadClass(): def __init__(self): self.thread = threading.Thread(target=self.callback) self.thread.start() def __del__(self):

我试图通过运行一些示例来了解Python多线程,下面是一个我不太了解其行为的示例

#!python3.6

import threading
import time

class ThreadClass():

    def __init__(self):
        self.thread = threading.Thread(target=self.callback)
        self.thread.start()

    def __del__(self):
        print("DESTROYED")


    def callback(self):
        print("start second thread")
        print("second threadId=", threading.get_ident())
        print("self memory=", id(self))
        time.sleep(2)
        print("stop second thread")


def run():
    print("start first thread")
    print("first threadId=", threading.get_ident())
    thread = ThreadClass()
    print("threadClass memory=",id(thread))
    print("stop first thread")

run()
print("end")
我得到的结果是:

start first thread
first threadId= 140301467088640
start second thread
second threadId= 140301462193920
self memory= 140301465746680
threadClass memory= 140301465746680
stop first thread
end
stop second thread
DESTROYED
我不明白的是,为什么run()函数一结束,ThreadClass实例就不会被销毁。我的理解是ThreadClass的实例位于run()的堆栈上,所以当run()结束时,是否应该清除其堆栈并删除intstance?但不知何故,ThreadClass的同一个实例会一直保持活动状态,直到内存中其他地方的另一个线程使用它

换句话说,Python如何在线程之间共享内存

运行中的线程(及其对象)永远不会被垃圾收集(守护进程线程可能会与其进程一起终止,但这是另外一回事)

第二个线程的运行线程对象(存储在
ThreadClass
实例的
thread
中)引用
ThreadClass
实例的
callback
方法(因为此方法在线程中执行),因此线程运行时需要该实例

变量只包含对对象的引用,而不包含对象本身。只有在不再存在对对象的引用(弱引用除外)的情况下,才能对对象进行垃圾收集

run()
结束时,仅从堆栈中删除了一个引用。

注意:
def run()
与您的代码一样,它与类ThreadClass无关。检查缩进,注意
运行
是在类之外的模块级别定义的

在代码中,您可以启动第二个线程,而不必等待它完成。因此,正常程序(按原样运行())一直运行到最后,而(第二个)线程仍在运行。没有什么奇怪的,这就是为什么线程是为;以并行和异步方式运行

此外,为了实现完全响应,python不保证立即进行垃圾收集。如果一个变量不再被引用,那么没有任何东西会立即释放内存、任何句柄等。 因此,在整个python环境完成之前,线程可能不会停止存在(和运行)。
例如,模块线程将保留对线程的引用。

尝试更改
target=lambda:time.sleep(2)
,您将看到
ThreadClass
实例首先被垃圾收集。在您的示例中,它不能被垃圾收集,因为正在运行的线程仍然持有对它的引用(确切地说是对
回调
方法的引用)。