> 백엔드 개발 > Golang > 시간 초과 후 Go Goroutine 실행을 중지하는 방법은 무엇입니까?

시간 초과 후 Go Goroutine 실행을 중지하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-24 11:21:15
원래의
180명이 탐색했습니다.

How to Stop a Go Goroutine Execution After a Timeout?

시간 초과 시 고루틴 실행 중지

Go에서 고루틴은 코드를 동시에 실행할 수 있는 가벼운 방법을 제공합니다. 그러나 때로는 특정 시간이 지난 후 고루틴을 중지해야 하는 경우가 있습니다.

문제:

시간 초과 후에도 고루틴이 계속 실행되는 문제가 사용자에게 발생했습니다. 설정되었습니다. 그들은 시간 초과에 도달하면 고루틴이 즉시 중지될 것으로 예상했지만 대신 추가 메시지를 인쇄했습니다. 다음은 예제 코드입니다.

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

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

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

예상 출력:

  • Timed out

실제 출력:

  • 시간 초과
  • test
  • test1

분석:

문제는 수신 측에서 시간 초과가 설정되어 있기 때문에 발생합니다. 채널 ch는 송신 측이 아닙니다. 시간 초과는 50밀리초 내에 데이터가 수신되지 않았음을 정확하게 식별하지만, 고루틴이 추가로 실행되고 나중에 채널에서 데이터를 보내는 것을 막지는 않습니다.

해결책:

Go에서 고루틴의 실행을 직접 중단하는 것은 불가능하므로 대체 접근 방식은 다음과 같습니다. 필요:

  • 전송을 차단하고 채널이 수신할 준비가 될 때까지 고루틴을 강제로 기다리게 하는 버퍼링되지 않은 채널을 사용하세요.
  • 취소와 함께 컨텍스트를 사용하여 고루틴에 전달하세요. 타임아웃이 발생하면 컨텍스트를 취소하고 고루틴은 컨텍스트를 확인하고 일찍 반환해야 합니다.
  • 뮤텍스나 대기 그룹과 같은 사용자 정의 동기화 기술을 사용하여 고루틴 실행을 제어하고 적시에 종료되도록 합니다.

위 내용은 시간 초과 후 Go Goroutine 실행을 중지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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