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 関数終了」と出力します。
チャネルを利用したこのようなゴルーチンの終了パターンは、ゴルーチンの実行を同期させる簡単かつ堅牢な方法を提供するため、広く利用されています。