>  기사  >  백엔드 개발  >  여기에 패닉이 발생할 가능성이 있습니까?

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

WBOY
WBOY앞으로
2024-02-05 21:36:111139검색

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

질문 내용

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으로 문의하시기 바랍니다. 삭제