>  기사  >  백엔드 개발  >  golang이 채널을 닫을 때 수신자 goroutine은 절대 차단하지 않습니다.

golang이 채널을 닫을 때 수신자 goroutine은 절대 차단하지 않습니다.

王林
王林앞으로
2024-02-06 08:25:071138검색

golang이 채널을 닫을 때 수신자 goroutine은 절대 차단하지 않습니다.

질문 내용

go 채널을 배우기 위해 아래와 같은 코드를 작성했습니다.

으아악

close() 함수를 주석 처리하면 "모든 고루틴은 절전 모드 - 교착 상태입니다!"라는 오류 메시지가 표시되므로 "for" 문이 차단됩니다. 이는 합리적으로 보입니다.

주석을 제거해도 close() "for" 문은 멈추지 않습니다. 수신자는 채널에서 기본값 0과 nil을 가져오고 절대 차단하지 않습니다.

채널에 아무 것도 보내지 않고 채널을 정의한 후 close()전화를 걸어도. 수신자는 절대로 차단하거나 오류를 일으키지 않습니다.

close 함수의 기능이 무엇인지 궁금합니다. 특정 유형의 기본값을 채널에 보내는 go 루틴을 시작하고 절대 멈추지 않나요? close 函数的作用感到困惑,它是否启动一个 go 例程将特定类型的默认值发送到通道,并且永远不会停止?


正确答案


当频道关闭时,您仍然可以阅读它,但您的 ok 将为 false。所以,这就是为什么你的 for 永远不会停止。并且,您需要通过条件 if !ok {break } 来中断 for

정답

채널이 닫혀도 읽을 수는 있지만 ok는 거짓입니다. 이것이 바로 for가 결코 멈추지 않는 이유입니다. 또한 조건부 if !ok {break }를 사용하여 for 문을 중단해야 합니다.

make(chan int, 1)채널이 닫히지 않은 경우 해당 채널에서 데이터를 읽으려고 하면 버퍼링/버퍼링되지 않은 채널에 따라 차단되거나 차단되지 않습니다.
make(chan int)버퍼 채널: 크기(

)를 지정합니다.

버퍼링되지 않은 채널: 크기를 지정하지 않았습니다(close 的情况下,它将从您缓冲的通道读取数据一次,因为您通过 intchan 和 <code>strchan )

댓글로

채널에 데이터를 보냅니다. 따라서 콘솔에 다음과 같은 결과가 인쇄되는 것을 볼 수 있습니다.

으아악 all goroutine are sleep - deadlock그러나 이후에는 두 버퍼 채널에 더 이상 데이터가 없습니다. 그런 다음 읽으려고 하면 버퍼링된 채널에 데이터가 없기 때문에 차단됩니다. (실제로 데이터가 없을 때도 버퍼링이 없는 경우도 마찬가지입니다.)

그러면 채널의 데이터를 기다리면서 메인 고루틴이 차단되었기 때문에

가 발생합니다. 그런데 이 프로그램을 실행하면 코드를 실행하기 위한 기본 고루틴이 시작됩니다. 하나의 메인 고루틴만 차단된다면, 누구도 코드 실행을 도울 수 없다는 의미입니다.

for 문 앞에 다음 코드를 추가할 수 있습니다. 🎜 으아악 🎜코드를 "실행할 수 있는" 고루틴이 여전히 있기 때문에 교착 상태가 발생하지 않는다는 것을 알게 될 것입니다. 🎜

위 내용은 golang이 채널을 닫을 때 수신자 goroutine은 절대 차단하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제