> 백엔드 개발 > Golang > 골랑찬은 차단할 수 없어

골랑찬은 차단할 수 없어

WBOY
풀어 주다: 2023-05-15 12:36:07
원래의
637명이 탐색했습니다.

Go 언어의 채널은 동시 프로그래밍에서 데이터 공유 및 동기화를 실현할 수 있는 매우 유용한 데이터 구조이며 매우 효율적입니다. 하지만 채널을 사용할 때 특별한 주의가 필요한 것이 하나 있는데, 이 역시 많은 Go 언어 초보자들이 자주 저지르는 실수, 즉 chan이 차단할 수 없는 실수이기도 합니다.

Go 언어에서는 여러 고루틴 간의 데이터 전송 및 동기화가 채널을 통해 달성될 수 있으므로 번거로운 동기화 잠금 및 불가피한 교착 상태 문제를 피할 수 있습니다. 채널을 사용하여 두 개 이상의 고루틴 간에 데이터를 보내고 받을 때 다음 코드를 자주 사용합니다:

ch := make(chan int)

go func() {
    ch <- 1
}()

value := <-ch
fmt.Println(value)
로그인 후 복사

이 코드에서는 int 유형의 채널을 만들고 이를 새 채널에 사용합니다. 정수 1이 채널로 전송됩니다. 고루틴에서. 그런 다음 기본 고루틴에서 <-ch를 호출하여 채널의 데이터를 수락하고 인쇄합니다. 이 예제는 간단하지만 채널을 사용하여 두 고루틴 간에 데이터를 동기화하는 방법을 보여줍니다.

위 코드에서 이 채널은 명시적으로 닫히지 않았고 캐시되지도 않았음을 알 수 있습니다. 그렇다면 이 경우 닫히지 않고 캐시되지 않은 채널을 읽으면 어떻게 될까요?

이 경우 채널이 비어 있으면 고루틴이 새 값을 쓰거나 채널을 닫을 때까지 읽을 때 차단됩니다. 그러나 채널이 비어 있으면 프로그램이 영구적으로 차단됩니다. 이는 매우 위험한 상황이며 실제 응용 프로그램에서 교착 상태 및 기타 문제를 일으키는 경우가 많습니다.

그러면 어떻게 이런 일을 피할 수 있을까요? 실제로는 매우 간단합니다. 채널을 사용할 때 채널이 차단되지 않는지 확인하면 됩니다. 채널을 사용할 때 채널이 비어 있지 않다는 것을 보장할 수 있는 한 차단 문제를 피할 수 있습니다.

일반적인 방법은 고루틴이 값을 쓰기 전에 다음 채널의 상태가 비어 있는지 확인하거나, 값 쓰기로 인해 차단이 발생하지 않도록 채널을 캐싱할 때 용량을 부여하는 것입니다. 예를 들어, 다음 예에서는 캐시된 채널을 사용합니다.

ch := make(chan int, 1)

ch <- 1

value := <-ch
fmt.Println(value)
로그인 후 복사

여기서는 채널을 생성할 때 용량을 1로 지정하므로 값을 쓴 후 값을 즉시 읽지 않더라도 프로그램은 여전히 차단됩니다. 이렇게 하면 위에서 언급한 문제를 피할 수 있습니다.

캐시된 채널을 사용하여 차단을 방지하는 것 외에도 select 문을 사용하여 채널 읽기 및 쓰기 작업을 처리할 수도 있습니다. select 문은 동시에 여러 채널을 모니터링할 수 있으며, 채널 중 하나가 값을 받으면 해당 작업이 즉시 수행됩니다. 다음 예를 들어보세요.

ch := make(chan int)

timer := time.NewTicker(time.Second)

select {
case ch <- 1:
    fmt.Println("value sent")
case <-timer.C:
    fmt.Println("timeout")
}
로그인 후 복사

여기서 매초마다 트리거되는 새 티커를 만듭니다. 그런 다음 select 문에서 두 개의 채널을 수신합니다. ch를 쓸 수 있으면 "value sent"가 출력되고, 그렇지 않으면 1초 후에 "timeout"이 출력됩니다.

요약하자면 채널은 매우 유용한 데이터 구조이지만 차단을 방지하려면 사용할 때 특별한 주의가 필요합니다. 채널을 사용할 때 채널이 차단되지 않는 한 이 도구를 최대한 활용하여 효율적인 동시 프로그래밍을 달성할 수 있습니다.

위 내용은 골랑찬은 차단할 수 없어의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿