gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:33:14 24 4
gpt4 key购买 nike

我试图通过运行一些示例来了解 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

我不明白的是为什么 ThreadClass 实例不会在 run() 函数结束后立即销毁。我的理解是 ThreadClass 的实例位于 run() 的堆栈上,因此当 run() 结束时,是否应该清除其堆栈并删除实例?但不知何故,ThreadClass 的同一个实例一直保持事件状态,直到内存中其他位置的另一个线程完成它为止。

也就是说,Python如何在线程之间共享内存?

最佳答案

正在运行的线程(及其对象)永远不会被垃圾收集(守护线程可能会随其进程一起终止,但那是别的事情)。

第二个线程的运行线程对象(存储在ThreadClass实例的thread中)引用ThreadClass的callback方法 实例(因为这个方法是在线程中执行的)所以线程运行时需要实例。

变量仅包含对对象的引用,而不包含对象本身。仅当不再存在对对象的引用(弱引用除外)时,才能对对象进行垃圾回收。

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

关于python - 线程如何共享对实例的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52617611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com