3

ゴルーチンを使用して単純なクロック信号を作成しました。

func clockloop(ch chan byte) {
    count := 0
    for {
        time.Sleep(FRAMELEN)
        count++
    innerfor:
        for count {
            select {
                case ch <- 1:
                    count--
                default:
                    break innerfor
            }
        }
    }
}

func MakeClock() chan byte {
    clock := make(chan byte)
    go clockloop(clock)
    return clock
}

この時計が不正確であることは知っていますが、それは関係ありません。私が知りたいのは、このゴルーチンを停止する最良の方法は何ですか?

理想的には、チャネルのリスナーが範囲外になるとすぐに停止することを望んでいましたが、その方法を知っています (ガベージ コレクターに似ていますが、ゴルーチン用です)。私はそれを手動で停止する 2 つの方法を考え出しました: (1) そのようなすべてのゴルーチンがすべてのループをチェックするグローバルな停止変数を使用する方法と、(2) 停止チャネルを使用する方法です。これらのそれぞれの欠点は、ゴルーチンを手動で停止する必要があることです。

4

1 に答える 1

10

停止チャネルは、それを行うための良い方法です。ゴルーチンはそれ自体を停止する必要があります。外部から殺す方法はありません。

参考までに、Go-Nuts にこのスレッドがあり、Ian は本質的にこれを述べており、Russ は次のように付け加えています。プログラムが円滑に進行し続けるために。」

于 2012-06-20T16:11:10.457 に答える