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.

questionAnswers(4)

yourAnswerToTheQuestion