当不再使用生成器时,它应该被垃圾收集,对吧?我尝试了以下代码,但我不确定我错了哪一部分。
import weakref
import gc
def countdown(n):
while n:
yield n
n-=1
cd = countdown(10)
cdw = weakref.ref(cd)()
print cd.next()
gc.collect()
print cd.next()
gc.collect()
print cdw.next()
在倒数第二行,我调用了垃圾收集器,因为不再调用cd
。gc
应该自由cd
吧。但是当我调用时cdw.next()
,它仍然在打印 8。我又尝试了几个cdw.next()
,它可以成功打印所有剩余的,直到 StopIteration。
我尝试了这个,因为我想了解生成器和协程是如何工作的。在 David Beazley 的 PyCon 演示文稿“A Curious Course on Coroutines and Concurrency”的幻灯片 28 中,他说协程可能会无限期地运行,我们应该使用.close()
它来关闭它。然后他说垃圾收集器会调用.close()
。在我的理解中,一旦我们调用.close()
了自己,gc
就会.close()
再次调用。会gc
收到无法调用.close()
已经关闭的协程的警告吗?
感谢您的任何意见。