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