채널을 열어 두는 것이 괜찮습니까?


160

상태를 확인하지 않으면 Go 채널을 계속 열어 두어야합니다 (채널을 닫지 마십시오)? 메모리 누수가 발생합니까? 다음 코드는 괜찮습니까?

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

답변:


236

Go 채널을 영원히 열어두고 닫지 않는 것이 좋습니다. 채널이 더 이상 사용되지 않으면 가비지 수집됩니다.

수신기가 클로즈를 찾고있는 경우에만 채널을 닫아야합니다. 채널을 닫는 것은 더 이상 데이터가 뒤 따르지 않음을 나타내는 채널의 제어 신호입니다.

디자인 질문 : 채널 마감


3
링크의 응답에 동의하지 않습니다. 2GB 범위에서 메모리 누수가 발생했습니다. 내가 가까이에 추가하자마자 간헐천은 물방울이되었습니다.
Richard

9
@Richard : 전체 스레드를주의 깊게 읽으십시오. 를 찾고 있지 않는 한 Go gc의 저자와 gccgo채널 close의 저자는 필요하지 않습니다 close. 그것은 권위있는 조언입니다.
peterSO

6
@ peterSO, 그럴 수도 있지만 내가 본 것을 알고 그것이 내가보고 한 것이므로 나를 닫지 마십시오.
Richard

1
버퍼링 된 채널이있는 경우 메시지를 추가하면 메모리를 사용해야합니다. 그러나 채널이 버퍼링되지 않거나 추가 된 것이 없으면 메모리 사용량이 증가하지 않습니다.
metakeule


31

예, 채널을 열어 두는 것이 좋습니다. 으로 이동 프로그래밍 언어 책은 말했다 :

작업이 끝나면 모든 채널을 닫을 필요는 없습니다. 수신 고 루틴에게 모든 데이터가 전송되었음을 알리는 것이 중요 할 때만 채널을 닫으면됩니다. 가비지 수집기가 도달 할 수 없다고 결정한 채널은 닫혔는지 여부에 관계없이 자원을 회수합니다. (이것은 열린 파일에 대한 닫기 작업과 혼동하지 마십시오. 작업 이 끝나면 모든 파일 에서 Close 메서드 를 호출하는 것이 중요 합니다.)


7

예, 채널을 열어 두는 것이 좋습니다. 실제로는 일반적입니다. 열려있는 채널은 채널 객체에 대한 참조를 구성하지 않으므로 가비지 수집되지 않습니다.


1

" Go 채널을 사용하는 일반적인 원칙 중 하나는 수신자 측에서 채널을 닫지 않고 채널에 동시 발신자가 여러 개인 경우 채널을 닫지 않는 것입니다. "

위의 답변에서 명확하게 언급했듯이 모든 채널은 일단 정리 표시가 된 후에는 결국 GC가 될 것이므로 채널을 닫지 않은 채로 두는 것이 유일한 차이점은 채널이 gc몇 사이클 후에도 가능할 것이라는 것입니다 명시 적으로 닫히지 않았습니다.

또한 다음 기사 thisthis 는 1 : N, N : 1 또는 M : N (발신자 : 수신자)의 경우 채널을 닫는 다양한 방법을 보여줍니다


-5

Go는 가비지 수집이므로 실제로 아무것도 '무료'할 필요는 없습니다.

채널을 닫을 가능성이 있지만 대부분 close-channel로 사용됩니다. 해당 채널에서 다른 어떤 것도 전송되지 않는다고 고 루틴 (또는 메인 프로그램)에 알려주십시오.


8
가비지 수집 언어에서도 AFAIK는 프로그래머가 여전히 파일, 소켓 등의 관리되지 않는 리소스를 해제 할 책임이 있습니다. 파일처럼 채널을 닫아야합니까?
Kluyg

3
@Kluyg 대답은 '아니요'입니다. 채널이 아닌 OS 리소스에 대해 이야기하고 있습니다. 리소스와 언어에 따라 다르지만 일반적으로 GC는 그렇지 않기 때문에 비 결정적이므로 OS 리소스를 수동으로 닫는 것이 좋습니다. 가장 일반적인 관련 문제너무 많은 열린 파일 오류입니다. 파일 열기를 계속합니다 ... GC가 그렇게 할 것으로 예상합니다 ... 메모리가 부족하지 않습니다 (따라서 GC가 시작되지 않습니다) ... OS 수준에서 파일 설명자가 부족합니다. OS는 :) 프로세스를 죽이고
Pijusn

나는 이것이 전체 시간 동안 정확하고 다른 허용 된 답변과 동일한 상태를 유지하면서 왜 이렇게 많은 다운 보트를 얻었는지에 대해 혼란스러워합니다.
eja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.