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

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

Susan Sarandon
Susan Sarandon원래의
2024-12-16 18:56:15348검색

How to Cancel a Go Goroutine's Execution After a Timeout?

시간 초과 시 Goroutine 실행 취소

Go 루틴에서는 특정 시간 임계값을 초과하여 작업을 종료해야 할 수도 있습니다. Go는 일반적으로 실행을 직접 제어하지 않고 고루틴을 비동기식으로 실행하므로 이는 문제가 될 수 있습니다. iris 프레임워크를 사용할 때 한 가지 일반적인 시나리오가 발생합니다. 여기서는 시간 초과가 발생한 후에도 goroutine이 계속 실행되는 상황이 발생할 수 있습니다.

다음 코드 조각을 고려하세요.

package main

import (
    "fmt"
    "time"
)

func main() {
    Res := make(chan Response, 1)

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

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

type Response struct {
    data   interface{}
    status bool
}

그림과 같습니다. 이 예에서는 10초 지연 후 인쇄 테스트를 위해 고루틴이 시작됩니다. 채널(Res)은 고루틴과 기본 고루틴 간의 통신을 용이하게 하는 데 사용됩니다. 고루틴의 응답이나 50밀리초의 시간 초과를 기다리기 위해 select 문이 사용됩니다.

그러나 예상되는 동작은 시간 초과가 발생하자마자 고루틴이 종료되어야 한다는 것입니다. 대신, 출력에는 제한 시간이 만료되었음에도 테스트가 계속 인쇄되는 것으로 표시됩니다.

이는 Go에 실행 중인 고루틴의 실행을 강제로 중단할 수 있는 간단한 방법이 없기 때문에 발생합니다. Go는 새로운 고루틴이 별도의 실행 스레드로 생성되는 포크-조인 동시성 모델에서 작동합니다. 일단 생성되면 고루틴의 예약 및 처리는 Go 런타임의 책임의 일부가 됩니다.

이 문제를 해결하려면 고루틴 동작을 보다 세부적으로 제어할 수 있는 동기화 기술을 채택하는 것이 좋습니다.

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

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