部分代碼參考: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()全部退出。
————————————————
版權聲明:本文為CSDN博主「____Luke」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/soekchl521/article/details/72420535
