ホームページ > バックエンド開発 > Golang > Golang コルーチンを閉じる方法

Golang コルーチンを閉じる方法

リリース: 2019-12-28 10:14:58
オリジナル
7400 人が閲覧しました

Golang コルーチンを閉じる方法

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート