go: ブロックしているゴルーチンをどのように終了させるか

Goでのゴルーチンの終了は通常chanを用いて実装されます。以下はブロックするゴルーチンの終了を実現する一般的なパターンです。

package main

import (
    "fmt"
    "time"
)

func worker(done chan bool) {
    fmt.Println("协程开始执行...")
    
    // 模拟耗时操作
    time.Sleep(2 * time.Second)
    
    fmt.Println("协程执行完毕!")
    done <- true
}

func main() {
    done := make(chan bool)
    
    go worker(done)
    
    // 阻塞等待协程完成
    <-done
    
    fmt.Println("主函数退出")
}

上の例で、worker 関数はブロックするコルーチンで、時間のかかる操作を実行します。worker 関数の処理完了後、main 関数のコルーチンの完了が done チャンネルに true が送信されて通知されます。main 関数は <-done 構文を使用してチャンネルからデータを受信し、コルーチンの完了を待ってブロックされます。データを受信すると、main 関数は処理を続行し、「main 関数終了」と出力します。

チャネルを利用したこのようなゴルーチンの終了パターンは、ゴルーチンの実行を同期させる簡単かつ堅牢な方法を提供するため、広く利用されています。

bannerAds