>백엔드 개발 >Golang >Go에서 시간 초과가 발생한 후 Goroutine의 실행을 올바르게 중지하려면 어떻게 해야 합니까?

Go에서 시간 초과가 발생한 후 Goroutine의 실행을 올바르게 중지하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-11 21:30:12991검색

How Can I Properly Stop a Goroutine's Execution After a Timeout in Go?

Go에서 시간 초과로 고루틴 실행 중지

시간 초과 시 고루틴 실행을 종료하려고 하면 효과가 없는 것처럼 보일 수 있습니다. 이는 Go의 동시성 모델이 포크 조인(fork-join) 원칙에 따라 작동하기 때문입니다. 여기서 고루틴(포크)을 시작해도 실행을 즉시 제어할 수는 없습니다. 채널 통신과 같은 동기화 지점에서만 제어가 회복됩니다.

주어진 예에서:

go func() {
    time.Sleep(10 * time.Second)
    fmt.Println("test")
    fmt.Println("test1")
    ch <- Response{data: "data", status: true}
}()

설정된 시간 초과에도 불구하고 goroutine은 계속 실행됩니다.

case <-time.After(50 * time.Millisecond):
    return "Timed out", false

시간 초과는 발신자가 아닌 채널의 수신자(리더)와 관련이 있기 때문입니다. 채널이 버퍼링되어 있으므로 발신자는 중단 없이 계속 실행할 수 있습니다.

원하는 동작을 달성하려면 동기화 기술을 사용해야 합니다. 예를 들어, 추가 통신을 방지하기 위해 시간 초과 시 채널이 닫힐 수 있습니다.

select {
case <-ch:
    fmt.Println("Read from ch")
    res := <-ch
    return res.data, res.status
case <-time.After(50 * time.Millisecond):
    close(ch)
    return "Timed out", false
}

위 내용은 Go에서 시간 초과가 발생한 후 Goroutine의 실행을 올바르게 중지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.