Um gerador Python será coletado se não for mais usado, mas ainda não atingiu o StopIteration?
Quando um gerador não é mais usado, ele deve ser coletado, certo? Eu tentei o seguinte código, mas não tenho certeza qual parte eu estava errado.
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()
Na segunda última linha, eu chamei o coletor de lixo e como não há chamada paracd
não mais.gc
deveria libertarcd
certo. Mas quando eu chamocdw.next()
, ainda está imprimindo 8. Eu tentei mais algunscdw.next()
, poderia imprimir com sucesso todo o resto até StopIteration.
Eu tentei isso porque queria entender como o gerador e a co-rotina funcionam. No slide 28 da apresentação da PyCon de David Beazley, "Um Curioso Curso de Coroutines e Concorrência", ele disse que uma co-rotina pode funcionar indefinidamente e devemos usar.close()
para desligá-lo. Então ele disse que o coletor de lixo vai chamar.close()
. No meu entendimento, uma vez que ligamos.close()
nós mesmos,gc
chamará.close()
novamente. Vaigc
receber um aviso de que não pode ligar.close()
em uma co-rotina já fechada?
Obrigado por qualquer entrada.