여기에 패닉이 발생할 가능성이 있습니까?

WBOY
풀어 주다: 2024-02-05 21:36:11
앞으로
1141명이 탐색했습니다.

여기에 패닉이 발생할 가능성이 있습니까?

질문 내용

func main() {
    rand.Seed(time.Now().Unix())
    ctx, cancelFunc := context.WithCancel(context.Background())
    anies := make(chan any)
    go doSomething(ctx, anies)
    intn := rand.Intn(2)
    if intn == 0 { //BRANCH1
        cancelFunc()
        close(anies) 
    }
    time.Sleep(time.Second)
}

func doSomething(ctx context.Context, anies chan any) {
    for {
         if ctx.Err() == nil { //LINE2
            anies <- 1 //LINE3
        }
    }
}
로그인 후 복사

Line2와 Line3 사이에 Branch1이 발생하면 패닉이 올 수 있나요?


정답


네, 패닉이 가능합니다. 다음은 패닉이 발생한 타임라인의 예입니다. 행은 시간의 오름차순으로 정렬됩니다. N: 접두사는 고루틴을 나타냅니다.

1: 코루틴 2 시작
2: ctx.Err()을 호출하면 nil을 반환합니다
1: cancelFunc()
를 호출하세요. 1: anis 채널 닫기
2: 모든 채널로 보냅니다. 채널이 닫혀 있어서 당황하세요.

위 내용은 여기에 패닉이 발생할 가능성이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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