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

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

Mary-Kate Olsen
풀어 주다: 2024-12-11 21:30:12
원래의
1092명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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