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)
}