¿Se recolectará la basura de un generador de Python si ya no se va a usar pero aún no ha alcanzado StopIteration?

Cuando un generador ya no se usa, debe ser recolectado basura, ¿verdad? Probé el siguiente código, pero no estoy seguro de qué parte estaba equivocada.

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()

En la segunda última línea, llamé al recolector de basura y como no hay llamada acd nunca más.gc debería liberarcd Correcto. Pero cuando llamocdw.next(), todavía está imprimiendo 8. Probé un poco máscdw.next(), pudo imprimir con éxito todo el resto hasta StopIteration.

Intenté esto porque quería entender cómo funcionan el generador y la coroutina. En la diapositiva 28 de la presentación de PyCon de David Beazley "Un curso curioso sobre coroutines y concurrencia", dijo que una coroutine podría correr indefinidamente y deberíamos usar.close() para apagarlo. Luego dijo que el recolector de basura llamará.close(). En mi entendimiento, una vez que llamamos.close() Nosotros mismos,gc llamará.close() otra vez. Serágc recibir una advertencia de que no puede llamar.close() en una coroutine ya cerrada?

Gracias por cualquier entrada.

Respuestas a la pregunta(4)

Su respuesta a la pregunta