golang 主进程与协程的关系
来源:原创
时间:2021-03-10
作者:脚本小站
分类:GoLang
主进程退出后协程也会跟着主进程一起退出,无论主进程时候退出。
package main import ( "fmt" "time" ) func test() { for i := 0; i < 20; i++ { fmt.Println("test() hello", i) time.Sleep(time.Millisecond * 100) } } func main() { go test() fmt.Println("-------------") for i := 0; i < 20; i++ { fmt.Println("main() hello", i) time.Sleep(time.Millisecond * 50) } }
使用sync.WaitGroup可以让主进程等待协程执行完成再退出:
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func test() { for i := 0; i < 20; i++ { fmt.Println("test() hello", i) time.Sleep(time.Millisecond * 100) } wg.Done() // 协程计数器 -1 fmt.Println("协程退出") } func main() { wg.Add(1) // 协程计数器 +1 go test() fmt.Println("-------------") for i := 0; i < 20; i++ { fmt.Println("main() hello", i) time.Sleep(time.Millisecond * 50) } wg.Wait() fmt.Println("主线程退出") }
统计素数:
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func test(n int) { for num := (n-1)*30000 + 1; num < n*30000; num++ { if num > 1 { var flag = true for i := 2; i < num; i++ { if num%i == 0 { flag = false break } } if flag { fmt.Println(num, "是素数") } } } wg.Done() // 减一 } func main() { start := time.Now().Unix() for i := 0; i < 4; i++ { wg.Add(1) // 加一 go test(i) } wg.Wait() end := time.Now().Unix() fmt.Println(end - start) }