1. 채널을 통해 종료 신호 전달
채널은 go의 기본 데이터 유형으로 nil, open, close 3가지가 있습니다.
공유 메모리를 통해 데이터를 공유하는 대신 채널을 통해 데이터를 공유하세요. 기본 프로세스는 다음과 같이 채널을 통해 모든 고루틴에 중지 신호를 보낼 수 있습니다.
func run(done chan int) { for { select { case <-done: fmt.Println("exiting...") done <- 1 break default: } time.Sleep(time.Second * 1) fmt.Println("do something") } } func main() { c := make(chan int) go run(c) fmt.Println("wait") time.Sleep(time.Second * 5) c <- 1 <-c fmt.Println("main exited") }
2. waitgroup 사용
일반적으로 다음과 같이 waitgroup을 사용합니다.
1 가정하여 Waitgroup의 인스턴스를 만듭니다. 여기서는 이를 wg
2라고 합니다. 각 고루틴이 시작되면 wg.Add(1)을 호출합니다. 이 작업은 고루틴이 시작되기 전에 호출할 수도 있고, 고루틴 내부에서 호출할 수도 있습니다. 물론, n개의 고루틴을 만들기 전에 wg.Add(n)를 호출할 수도 있습니다
3. 각 고루틴이 작업을 완료하면 wg.Done()
4을 호출하세요. 여기서 모든 고루틴을 기다리고 있습니다. ), wg.Add(1)을 실행한 모든 고루틴이 wg.Done()을 호출하기 전에 차단되고, 모든 고루틴이 wg.Done()을 호출한 후에 반환됩니다.
예:
type Service struct { // Other things ch chan bool waitGroup *sync.WaitGroup } func NewService() *Service { s := &Service{ // Init Other things ch: make(chan bool), waitGroup: &sync.WaitGroup{}, } return s } func (s *Service) Stop() { close(s.ch) s.waitGroup.Wait() } func (s *Service) Serve() { s.waitGroup.Add(1) defer s.waitGroup.Done() for { select { case <-s.ch: fmt.Println("stopping...") return default: } s.waitGroup.Add(1) go s.anotherServer() } } func (s *Service) anotherServer() { defer s.waitGroup.Done() for { select { case <-s.ch: fmt.Println("stopping...") return default: } // Do something } } func main() { service := NewService() go service.Serve() // Handle SIGINT and SIGTERM. ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) fmt.Println(<-ch) // Stop the service gracefully. service.Stop() }
더 많은 golang 지식을 알고 싶다면 golang tutorial 칼럼을 주목해주세요.
위 내용은 golang 코루틴을 닫는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!