1. 代码结构
在这里插入图片描述2 gorotine.go
package gorotine
import (
"fmt"
"sync"
"time"
)
//定义WG,用sync中的函数来同步数据
var WG sync.WaitGroup
func Read() {
for i :=0 ; i<=10 ; i++ {
WG.Add(1)
}
}
func Write() {
for i :=0 ; i <= 10 ; i++ {
time.Sleep(time.Second * 1)
fmt.Println("Done >",i)
WG.Done()
}
}
说明:
Add(n)
把计数器设置为n
Done()
每次把计数器-1
wait()
会阻塞代码的运行,直到计数器地值减为0
以上可知:
如果我把n 设置成2,那么我在下文main.go中可以打开两个协程执行WG.Write()
如果我把n仍设置成1,而在main.go中坚持打开两个协程执行WG.Write()
,那写到5就报错了。除非我把Write()中的循环条件写成i=0;i<=21;i++
3 main.go
package main
import (
"814/gorotine"
"fmt"
"time"
)
func main () {
//主线程来读(上文可知,此时WG的计数器被设置为1)
gorotine.Read()
//开启一个协程来写(写完后计数器被-1,为0)
go gorotine.Write()
//主线程等待协程写完(阻塞代码,知道计数器为0)
gorotine.WG.Wait()
//协程写完后主线程打印一个标记
fmt.Println("All dome")
//主线程等两秒后退出
time.Sleep(time.Second * 2 )
}
4. 输出
Done > 0
Done > 1
Done > 2
Done > 3
Done > 4
Done > 5
Done > 6
Done > 7
Done > 8
Done > 9
Done > 10
All dome
Process finished with the exit code 0
网友评论