생산자의 수명이 짧은 경우 Go Goroutines에서 교착 상태를 피하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-25 07:09:02
원래의
793명이 탐색했습니다.

How to Avoid Deadlock in Go Goroutines When Producers Are Short-Lived?

Go 고루틴의 교착 상태 해결

동시 프로그래밍에서 여러 고루틴이 서로 작업이 완료될 때까지 무한정 기다릴 때 교착 상태가 발생하여 효과적으로 중단됩니다. 프로그램. 이 문서에서는 원래 질문에 설명된 대로 Go 동시성에서 발생하는 특정 교착 상태를 다룹니다.

<code class="go">package main

import (
    "fmt"
    "time"
)

func producer(ch chan int, d time.Duration, num int) {
    for i := 0; i < num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    ch := make(chan int)
    go producer(ch, 100*time.Millisecond, 2)
    go producer(ch, 200*time.Millisecond, 5)
    for {
        fmt.Println(<-ch)
    }
    close(ch)
}</code>
로그인 후 복사

이 코드는 다음 요인으로 인해 교착 상태 오류를 유발합니다.

  • 생산자 채널에 값을 보내는 는 수명이 짧다가 결국 데이터 생성을 중단합니다.
  • 메인 함수의 무한 for 루프는 종료 조건 없이 채널에서 계속 값을 받습니다.
  • 무한 루프 후에 채널이 닫혀 더 이상 값을 수신할 수 없게 됩니다.

해결책: 조정 종료

교착 상태를 방지하려면 생산자가 다음을 수행해야 합니다. 신호 완료를 위해 조정되어야 하며 마지막 생산자가 채널을 닫아야 합니다. 조정을 위해 sync.WaitGroup을 사용하는 효율적인 솔루션은 다음과 같습니다.

<code class="go">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() {
    wg := &sync.WaitGroup{}
    ch := make(chan int)

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

    go func() {
        wg.Wait()
        close(ch)
    }()

    for v := range ch {
        fmt.Println(v)
    }
}</code>
로그인 후 복사

이 솔루션에서는

  • 각 생산자에 대해 WaitGroup을 증가시킵니다.
  • 각 생산자 defer 문을 통해 완료 시 WaitGroup을 감소시킵니다.
  • 고루틴은 WaitGroup이 0(모든 생산자가 완료되었음을 의미)에 도달할 때까지 기다리고 채널을 닫습니다.
  • 메인 루프는 for 범위를 사용합니다. 채널이 닫히기 전에 채널에 전송된 값을 반복하도록 구성합니다.

위 내용은 생산자의 수명이 짧은 경우 Go Goroutines에서 교착 상태를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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