>백엔드 개발 >Golang >golang 코루틴을 닫는 방법

golang 코루틴을 닫는 방법

尚
원래의
2019-12-28 10:14:587402검색

golang 코루틴을 닫는 방법

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

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