GC如何收集两个线程的Class引用
How does the GC collect a Class reference by two threads
我的代码中有一些执行某些工作的工作线程。来自工作的数据被收集到一个小的 class 中,其中包含这些信息。这个class被放入一个Queue中,在主线程中进行处理。
GC 什么时候收集这个class?
短速读示例:
def run(in_q, out_q):
lp = lpClass()
# Do work and add info in class
workToDo = in_q.get_nowait()
while working:
lp.add(work data)
out_q.put_nowait(lp)
# main
t = thread(run, in_q, out_q)
t.start()
in_q.put_nowait(some work)
t.join()
while out_q.not_empty:
lp = out_q.get()
print(lp.getData())
Python 的垃圾收集器通常会丢弃不再被引用的对象。
在您的情况下,这将是在 while 循环中的 print()
完成并重新开始之后 - 用新引用替换 lp
中的先前数据。因此,旧对象不再被引用和垃圾收集。
Afaik,这对多线程程序和单线程程序都适用。
除了 python 文档之外,this post 对 python 中的垃圾收集器何时执行任务有一个写得很好的总结。
我的代码中有一些执行某些工作的工作线程。来自工作的数据被收集到一个小的 class 中,其中包含这些信息。这个class被放入一个Queue中,在主线程中进行处理。
GC 什么时候收集这个class?
短速读示例:
def run(in_q, out_q):
lp = lpClass()
# Do work and add info in class
workToDo = in_q.get_nowait()
while working:
lp.add(work data)
out_q.put_nowait(lp)
# main
t = thread(run, in_q, out_q)
t.start()
in_q.put_nowait(some work)
t.join()
while out_q.not_empty:
lp = out_q.get()
print(lp.getData())
Python 的垃圾收集器通常会丢弃不再被引用的对象。
在您的情况下,这将是在 while 循环中的 print()
完成并重新开始之后 - 用新引用替换 lp
中的先前数据。因此,旧对象不再被引用和垃圾收集。
Afaik,这对多线程程序和单线程程序都适用。
除了 python 文档之外,this post 对 python 中的垃圾收集器何时执行任务有一个写得很好的总结。