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