エージェントオブジェクトの消滅方法に着目したコード
参照させて頂いたページ https://qiita.com/yoshinori_hisakawa/items/a6608b29059a945fbbbd
// https://qiita.com/yoshinori_hisakawa/items/a6608b29059a945fbbbd
package main
import (
"context"
"fmt"
"sync"
"time"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(1)
go grandparent(&wg)
//time.Sleep(10 * time.Second)
wg.Wait()
}
func grandparent(wg *sync.WaitGroup) {
// contextを生成
defer wg.Done()
ctx := context.Background()
// 親のcontextを生成し、parentに渡す
ctxParent, cancel := context.WithCancel(ctx)
go parent(ctxParent, "Hello-parent")
// parentのcontextをキャンセル。mainを先に終了させないように1秒待ってから終了
cancel()
time.Sleep(1 * time.Second)
fmt.Println("grandparent end")
}
func parent(ctx context.Context, str string) {
// parentからcontextを生成し、childに渡す
childCtx, cancel := context.WithCancel(ctx)
go child(childCtx, "Hello-child")
defer cancel()
// 無限ループ
for {
select {
case <-ctx.Done():
fmt.Println(ctx.Err(), str)
return
}
}
}
func child(ctx context.Context, str string) {
// 無限ループ
for {
select {
case <-ctx.Done():
fmt.Println(ctx.Err(), str)
return
}
}
}
// context canceled Hello-child
// context canceled Hello-parent
// grandparent end