Когда генератор больше не используется, он должен собирать мусор, не так ли? Я попробовал следующий код, но я не уверен, в какой части я ошибся.
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.
Я пробовал это, потому что хотел понять, как работают генератор и сопрограмма. На слайде 28 презентации Дэвида Бэзли Пикона "Любопытный курс на Corouts и Concurrency" он сказал, что сопрограмма может работать бесконечно, и мы должны использовать .close()
, чтобы закрыть ее. Затем он сказал, что сборщик мусора вызовет .close()
. В моем понимании, как только мы назвали .close()
себя, gc
снова вызовет .close()
. Будет ли gc
получать предупреждение о том, что он не может вызвать .close()
на уже закрытой сопрограмме?
Спасибо за любые входы.