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