Golang 協程控制關閉
阿新 • • 發佈:2019-01-09
部分程式碼參考:https://zhuanlan.zhihu.com/p/26695984
這邊文章的的
package main import ( "context" "fmt" "time" ) func main() { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) go Proc(ctx, 1) go Proc(ctx, 2) go Proc(ctx, 3) go Proc(ctx, 4) time.Sleep(time.Second / 10) cancel() time.Sleep(time.Second) } func Proc(ctx context.Context, n int) { for { select { case <-ctx.Done(): return default: fmt.Printf("Proc-%d ", n) } } }
這種形式的協程關閉和 自己寫的區別在於 自己寫的話自己要記錄下協程的數量,關閉的chan等等
這種比較省事兒,不過用法還是有點侷限性的,比如協程裡面沒有 for{select } 這種結構的時候就比較尷尬了。
不過這種方法用在 遞迴呼叫的時候 相當好用的 就是 go func( go func1( go func2())) 這種一個協程呼叫另一個協程一直這樣的時候發現有問題了,就可以一個cancel()全部退出。