2011-12-21 19 views
78

¿Está bien dejar abierto un canal Go para siempre (nunca cerrar el canal) si nunca verifico su estado? ¿Llevará a pérdidas de memoria? ¿Está bien el siguiente código?¿Está bien dejar un canal abierto?

func (requestCh chan<- Request) GetResponse(data RequestData) Response { 
    reply := make(chan Response) 
    requestCh <- Request{data: data, replyCh: reply} 
    return <-reply 
} 

Respuesta

106

Está bien dejar abierto un canal Go para siempre y nunca cerrarlo. Cuando el canal ya no se use, será basura recolectada.

Tenga en cuenta que solo es necesario cerrar un canal si el receptor es en busca de un cierre. Cerrar el canal es una señal de control en el canal que indica que no hay más información.

Design Question: Channel Closing

+0

No estoy seguro de que estoy de acuerdo con la respuesta del enlace. Tuve una pérdida de memoria en el rango de 2GB. Tan pronto como agregué el cierre, el geiser se convirtió en un chorrito. – Richard

+0

@Richard: Lea todo el hilo con cuidado. El autor de Go 'gc' y el autor de' gccgo' dicen que 'close's no es necesario, a menos que esté buscando' close'. Ese es un consejo autorizado. – peterSO

+1

@peterSO, puede ser, pero sé lo que vi y eso es lo que informé, así que por favor no me desestime. – Richard

-1

Go es basura recolectada, por lo que realmente no tiene que 'liberar' nada.

Existe la posibilidad de cerrar canales, pero se usa principalmente como - cerrar (canal) - decirle a la goroutine (o programa principal) que nada más se enviará en ese canal.

+6

yo sepa, incluso en un lenguaje basura recogida un programador sigue siendo responsable de liberar recursos no administrados, por ejemplo cierre de archivos, tomas de corriente, etc. ¿Debo cerrar el canal como un archivo? – Kluyg

+0

@Kluyg La respuesta es no. Estás hablando de recursos de SO (qué canales no son). Depende de un recurso y un lenguaje, pero generalmente se recomienda cerrar manualmente los recursos del sistema operativo no porque GC no lo haga, sino porque no es determinista. El _gotcha_ relacionado más común es _muchos archivos abiertos_ error. Usted sigue abriendo archivos ... Espera que GC lo haga ... No se queda sin memoria (por lo tanto, el GC no se activa) ... Se agota la descripción de los archivos en el nivel del sistema operativo. El sistema operativo mata el proceso :) – Pijusn

1

Sí, está bien para dejar el canal abierto, y de hecho es típico. Un canal abierto no constituye una referencia al objeto del canal, por lo que no impide que se recolecte basura.

11

Sí, está bien mantener un canal abierto. Como the go programming language libro declaró:

No necesita cerrar cada canal cuando haya terminado con él. Es solo es necesario cerrar un canal cuando es importante decirle al recibir las rutinas de salida que todos los datos han sido enviados. Un canal que el recolector de basura determine como inalcanzable tendrá sus recursos recuperados, esté o no cerrado. (No hay que confundir esta con la operación de cierre de los archivos abiertos. Es importante llamar al Cerrar método en todos los archivos cuando haya terminado con él.)

Cuestiones relacionadas