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 中的垃圾收集器何时执行任务有一个写得很好的总结。