신호로 고루틴 중지
Go에서 고루틴은 동시성에 사용되는 경량 스레드입니다. 그러나 고루틴을 조기에 종료해야 하는 시나리오가 있을 수 있습니다. 이 문서에서는 신호 메커니즘을 사용하여 이를 달성하는 방법을 살펴봅니다.
제공된 코드에서 목표는 특정 조건(tooLate)이 true가 되면 고루틴을 중지하는 것입니다. 그러나 제안된 대로 두 번째 채널을 사용하면 실제로 읽을 때 고루틴이 차단됩니다.
선택과 함께 추가 채널 사용
더 나은 접근 방식은 별도의 채널( tooLate) 및 goroutine에서 select를 사용하여 처리 채널(proCh)과 tooLate 채널을 모두 모니터링합니다. tooLate가 신호를 받으면 고루틴은 정상적으로 종료될 수 있습니다.
<code class="go">package main import "fmt" import "time" func main() { tooLate := make(chan struct{}) proCh := make(chan string) go func() { for { fmt.Println("working") time.Sleep(1 * time.Second) select { case <-tooLate: fmt.Println("stopped") return case proCh <- "processed": default: // Adding default makes it non-blocking } fmt.Println("done here") } }() select { case proc := <-proCh: fmt.Println(proc) case <-time.After(1 * time.Second): fmt.Println("too late") close(tooLate) } time.Sleep(4 * time.Second) fmt.Println("finish\n") }</code>
이 업데이트된 코드에서는 타이머가 만료되면(너무 늦었음을 나타냄) tooLate 채널이 닫히고 고루틴에 신호를 보냅니다. 고루틴은 이 신호를 수신하고 그에 따라 종료됩니다.
sync.Cond 사용
고려해야 할 또 다른 옵션은 신호에 대한 보다 세부적인 제어를 제공하는 sync.Cond를 사용하는 것입니다. 하지만 좀 더 많은 설정과 동기화 로직이 필요합니다.
위 내용은 신호를 사용하여 Go에서 고루틴을 정상적으로 중지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!