使用channel实现Future任务
使用channel实现同步,make方式创建返回地址(可用),var ch chan int中ch值为nil
无缓冲channel特点:阻塞式,容量为0,长度为0,不能存储数据。具备同步能力,读写同步。channel应用于两个go程中,一个读一个写(go程数据通信(同步))
无缓存channel先取后放
有缓冲channel特点:非阻塞
作用:同步,通信
一.关闭channel
channel关闭后,只能读不能写
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}()
//方案1
for msg := range ch {
fmt.Println(msg)
}
//方案2
for {
msg, ok := <-ch
if ok {
fmt.Println(msg)
} else {
break
}
}
}
二.单向channel
import "fmt"
func main() {
ch:=make(chan int)
go test7(ch)
go test8(ch)
for {
;
}
}
func test7(ch chan<- int){
for i:=0;i<10 ;i++ {
ch<-i
}
}
func test8(ch <-chan int) {
for i:=0;i<10 ;i++ {
msg:=<-ch
fmt.Println(msg)
}
}
三.go程的同步(主go程和子go程的同步)
3.1 sync.WaitGroup
import (
"fmt"
"sync"
"time"
)
var group=new(sync.WaitGroup)
func main() {
go test5()
go test6()
//有几个go程启动
group.Add(2)
//等待结束
group.Wait()
}
func test5(){
time.Sleep(2*time.Second)
fmt.Println("5子go程执行了" )
group.Done()
}
func test6(){
time.Sleep(2*time.Second)
fmt.Println("6子go程执行了" )
group.Done()
}
3.2 channel.开启几个go程,就需要读取多少次
import (
"fmt"
"time"
)
var chs=make(chan int)
func main() {
fmt.Println("主go程开始了")
go test5()
go test6()
fmt.Println("主go程结束了")
<-chs
<-chs
}
func test5(){
time.Sleep(2*time.Second)
fmt.Println("5子go程执行了" )
chs<-10
}
func test6(){
time.Sleep(2*time.Second)
fmt.Println("6子go程执行了" )
chs<-10
}
3.3 主go程也sleep,只适合测试
import (
"fmt"
"time"
)
func main() {
fmt.Println("主go程开始了")
go test5()
go test6()
fmt.Println("主go程结束了")
time.Sleep(3time.Second)
}
func test5(){
time.Sleep(2time.Second)
fmt.Println("5子go程执行了" )
}
func test6(){
time.Sleep(2*time.Second)
fmt.Println("6子go程执行了" )
}