> 백엔드 개발 > Golang > Go 동시성 교착 상태를 해결하는 방법: '모든 고루틴이 잠자기 상태입니다'?

Go 동시성 교착 상태를 해결하는 방법: '모든 고루틴이 잠자기 상태입니다'?

Mary-Kate Olsen
풀어 주다: 2024-12-28 13:31:13
원래의
861명이 탐색했습니다.

How to Resolve Go Concurrency Deadlocks:

동시성 교착 상태 오류: "throw: All Goroutines Are Asleep"

Go에서 동시성으로 작업할 때 모든 경우 교착 상태가 발생할 수 있습니다. 고루틴은 서로가 작업을 수행하기를 기다리고 있습니다. 이 문제와 관련된 일반적인 오류 중 하나는 "throw: all goroutines are sleep - deadlock!"입니다.

문제 이해

다음 Go 프로그램을 고려하세요.

package main

import (
    "fmt"
)

func total(ch chan int) {
    res := 0
    for iter := range ch {
        res += iter
    }
    ch <- res
}

func main() {
    ch := make(chan int)
    go total(ch)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("Total is ", <-ch)
}
로그인 후 복사

이 프로그램을 실행할 때 "throw: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다!"라는 오류가 발생합니다. 그 이유는 ch 채널을 닫지 않기 때문에 total 함수의 범위 루프가 절대 종료되지 않기 때문입니다. 결과적으로, main 함수에서 결과를 받기를 기다리는 고루틴은 결코 결과를 받지 못합니다.

교착 상태 해결

이 교착 상태를 해결하려면 종료해야 합니다. 더 이상 값이 전송되지 않음을 나타내는 ch 채널입니다. 또한 별도의 채널을 사용하여 결과를 다시 보낼 수 있으므로 동일한 채널에서 직접 보내고 받는 것을 방지할 수 있습니다.

아래 수정된 프로그램은 이러한 문제를 해결합니다.

package main

import (
    "fmt"
)

func total(in chan int, out chan int) {
    res := 0
    for iter := range in {
        res += iter
    }
    out <- res // sends back the result
}

func main() {
    ch := make(chan int)
    rch := make(chan int)
    go total(ch, rch)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // this will end the loop in the total function
    result := <-rch // waits for total to give the result
    fmt.Println("Total is ", result)
}
로그인 후 복사

종료함으로써 ch 채널을 사용하고 결과에 대해 별도의 rch 채널을 사용하여 교착 상태를 제거하고 프로그램이 올바르게 실행되도록 합니다.

위 내용은 Go 동시성 교착 상태를 해결하는 방법: '모든 고루틴이 잠자기 상태입니다'?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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