1. 終了シグナルをチャネル経由で渡す
チャネルは go の基本データ型で、nil、open の 3 つの基本状態があります。 、 閉まっている。
共有メモリを通じてデータを共有するのではなく、チャネルを通じてデータを共有します。メインプロセスは、次のように、チャネルを通じて任意の goroutine に停止信号を送信できます:
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 を呼び出します。 goroutine は wg.Wait() を呼び出しますが、wg.Add(1) を実行したすべての goroutine が wg.Done() を呼び出す前にブロックされ、すべての goroutine が 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 チュートリアル 列に注目してください。
以上がGolang コルーチンを閉じる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。