> 백엔드 개발 > Golang > ## 동시 Go 프로그램에서 교착 상태를 피하는 방법은 무엇입니까?

## 동시 Go 프로그램에서 교착 상태를 피하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-25 09:00:29
원래의
780명이 탐색했습니다.

## How to Avoid Deadlocks in Concurrent Go Programs?

Go 동시성에서 고루틴 교착 상태 해결

동시 Go 프로그램에서 고루틴이 서로 리소스를 해제할 때까지 무기한 기다릴 때 교착 상태가 발생할 수 있습니다. 이러한 교착 상태를 해결하려면 다음 예를 고려하십시오.

<code class="go">// Create a channel for communication between goroutines.
ch := make(chan int)

// Start producer goroutines that send values to the channel.
go producer(ch, 100*time.Millisecond, 2)
go producer(ch, 200*time.Millisecond, 5)

// Indefinite loop to continuously receive values from the channel.
for {
    fmt.Println(<-ch)
}</code>
로그인 후 복사

이 코드는 교착 상태 오류를 발생시킵니다: "치명적인 오류: 모든 고루틴이 잠자기 상태입니다 - 교착 상태!" 이는 생산자의 수명이 유한하여 결국 전송이 중단되는 반면 소비자 고루틴은 끝없이 새로운 값을 기다리기 때문에 발생합니다. 이러한 교착 상태를 피하기 위해 두 가지 주요 전략을 사용할 수 있습니다:

1. 채널 종료:

채널은 한 번만 닫힐 수 있으므로 제작자가 소비자에게 종료 신호를 보내는 것이 중요합니다. 코디네이터는 프로듀서의 완성도를 모니터링하고 이에 따라 채널을 폐쇄할 수 있습니다.

2. 조정된 동기화:

sync.WaitGroup과 같은 동기화 프리미티브를 사용하여 프로듀서는 작업이 완료되면 코디네이터에게 알릴 수 있고 코디네이터는 모든 프로듀서가 완료되면 채널을 닫을 수 있습니다.

동기화를 사용하여 업데이트된 코드:

<code class="go">import (
    "fmt"
    "sync"
    "time"
)

func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) {
    defer wg.Done()

    for i := 0; i < num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    // Create a WaitGroup for coordinating producer completion.
    wg := &sync.WaitGroup{}

    // Initialize the channel for communication between goroutines.
    ch := make(chan int)

    // Start producer goroutines.
    wg.Add(2)
    go producer(ch, 100*time.Millisecond, 2, wg)
    go producer(ch, 200*time.Millisecond, 5, wg)

    // Assign a goroutine to close the channel when all producers have finished.
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Iterate over values from the channel until it's closed.
    for v := range ch {
        fmt.Println(v)
    }
}</code>
로그인 후 복사

결론:

채널 종료 또는 조정된 동기화를 구현함으로써 개발자는 고루틴 교착 상태를 효과적으로 방지할 수 있으며 동시 Go 프로그램의 적절한 조정을 보장합니다.

위 내용은 ## 동시 Go 프로그램에서 교착 상태를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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