>백엔드 개발 >Golang >메시지가 전송되는 방식에 따라 go 채널의 동작이 바뀌나요?

메시지가 전송되는 방식에 따라 go 채널의 동작이 바뀌나요?

WBOY
WBOY앞으로
2024-02-09 10:39:20788검색

go 通道的行为是否会根据消息发送到它的方式而改变?

php editor Xiaoxin Go 언어에서 채널은 고루틴 간에 데이터를 전송하는 데 사용되는 메커니즘입니다. 채널의 동작은 메시지가 전송되는 방식에 따라 달라집니다. 채널이 버퍼링되었다고 선언되면 메시지를 보내는 고루틴은 메시지를 채널의 버퍼에 넣은 다음 실행을 계속합니다. 채널이 버퍼링되지 않은 것으로 선언되면 메시지를 보내는 고루틴은 다른 고루틴이 채널에서 메시지를 받을 때까지 차단됩니다. 따라서 메시지가 전송되는 방식에 따라 채널의 동작이 변경된다고 말할 수 있습니다.

질문 내용

왜 이 두 코드가 다르게 실행되나요?

  1. 다음 코드를 실행하면 fatal 错误:所有 goroutine 都在休眠 - 死锁!오류가 반환됩니다.
으아악
  1. 다음 코드를 올바르게 실행하면 2와 3(각각 한 줄)이 반환됩니다.
으아악

#1은 ch가 버퍼링된 채널로 정의된 경우에만 올바르게 작동합니다. 왜? ch의 buffer()가 불평 없이 2개의 값을 받아들이는 이유는 무엇입니까?

해결 방법

버퍼되지 않은 채널의 전송 작업은 다른 고루틴이 데이터를 읽을 때까지 차단됩니다. 이것이 코드 교착 상태의 첫 번째 부분인 이유입니다. 채널로 보낼 때 다른 고루틴은 채널을 읽지 않습니다.

두 번째 경우에는 두 개의 값을 채널로 보내는 고루틴이 있고, 기본 고루틴은 전송하는 동안 채널에서 두 번 읽습니다. 채널은 두 개의 전송을 허용하지 않고 하나씩 허용합니다. 첫 번째 전송 작업은 첫 번째 읽기에 의해 차단 해제되고 두 번째 전송 작업은 두 번째 읽기에 의해 차단 해제됩니다.

위 내용은 메시지가 전송되는 방식에 따라 go 채널의 동작이 바뀌나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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