【Go言語】ゴルーチンを停止にはチャネルを使え!サンプルコードで説明

Go言語でゴルーチンを処理の途中で停止するには、ゴルーチンに終了のシグナルを送信するためにチャネルを使用します。

難しくないのでシンプルな解説のみ。

【Go言語】ゴルーチンを停止する方法はチャネルを使う

チャネルを介してゴルーチンで回っている処理にシグナルを送信することでゴルーチンが処理を停止させます。

※ご存知だと思いますが、チャネルとはゴルーチン間でデータを送受信するためのキューのようなものです。

では、そのゴルーチンを停止するサンプルコードです。


package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)
    go doWork(done)
    time.Sleep(time.Second * 5) // 5秒待機
    done <- true // ゴルーチンに停止を要求する
    fmt.Println("done")
}

func doWork(done chan bool) {
    for {
        select {
        default:
            fmt.Println("working")
            time.Sleep(time.Second)
        case <-done:
            return // ループを抜けてゴルーチンを停止
        }
    }
}

この例ではdoWork 関数がゴルーチンとして実行され、定期的に “working” というメッセージを出力します。main 関数では、 done というチャネルを作成し、 doWork 関数をゴルーチンとして実行します。その後、5秒間待機してから、done チャネルに true を送信して、doWork 関数に停止を要求します。

doWork 関数ではselect を使用して、デフォルトケースで無限ループを回しておきます。そしてdone チャネルからシグナルが送信された場合にはループを終了して、ゴルーチンを停止します。

注意点としてゴルーチンは必ずしも即座に停止するわけではなく、チャネルの受信が発生するまで実行を継続する可能性があることに注意してください。またチャネルを使用する場合は、ゴルーチンが必ず受信可能な状態になっている必要があります。