1. ホーム
  2. go

[解決済み] ゴルーチンの停止方法

2022-07-08 20:42:39

質問

メソッドを呼び出し、戻り値をチャネルで渡すゴルーチンがあります。

ch := make(chan int, 100)
go func(){
    for {
        ch <- do_stuff()
    }
}()

このようなゴルーチンを停止するにはどうしたらよいでしょうか?

どのように解決するのですか?

EDITです。 あなたの質問がゴルーチン内のちゃんねるに値を送信することであることを理解する前に、私は急いでこの答えを書き上げました。 以下のアプローチは、上で提案したように追加のちゃんねるを使用するか、すでに持っているちゃんねるが双方向であることを利用して、1つだけを使用することができます...

もしあなたのゴルーチンがちゃんねるから出る項目を処理するためだけに存在するならば、"close" 組み込み関数とチャンネル用の特別な受信フォームを利用することができます。

つまり、ちゃんねるでアイテムの送信が終わったら、ちゃんねるを閉じます。 そして、goroutine 内で、チャンネルが閉じられたかどうかを示す receive 演算子の追加パラメータを取得します。

以下は完全な例です(waitgroupは、ゴルーチンが完了するまでプロセスが継続することを確認するために使用されます)。

package main

import "sync"
func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    ch := make(chan int)
    go func() {
        for {
            foo, ok := <- ch
            if !ok {
                println("done")
                wg.Done()
                return
            }
            println(foo)
        }
    }()
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch)

    wg.Wait()
}