一 简介
比线程更加轻量级的并行方法。GO从语言层次就支持了这一操作
二 协程的使用
使用起来很简单,就只用关键字go标识一下,它就自动开一个协程去执行了
package main
import (
"fmt"
"time"
)
func show(){
fmt.Println("go")
}
func main() {//g语言中的 ‘{’ 不能独占一行
go show()
time.Sleep(time.Second)//延时一秒
fmt.Println("main")
}
结果
注意,主协程退出后,子协程也会退出
三Gosched
让出时间片,其他协程先执行
package main
import (
"fmt"
"runtime"
)
func show(){
fmt.Println("go")
}
func main() {//g语言中的 ‘{’ 不能独占一行
go show()
runtime.Gosched()
fmt.Println("main")
}
结果
四Goexit
结束协程
package main
import (
"fmt"
"runtime"
)
func show(){
runtime.Goexit()
fmt.Println("go")
}
func main() {//g语言中的 ‘{’ 不能独占一行
go show()
runtime.Gosched()
fmt.Println("main")
}
五 管道
可用于协程同步
package main
import (
"fmt"
)
var ch1 = make(chan int)
//创建全局channel
var num int = 0
func show(){
<-ch1//当管道没有数据,会阻塞在这一步
fmt.Println("num=",num)
}
func add(){
num++
ch1<-9
}
func main() {//g语言中的 ‘{’ 不能独占一行
go add()
go show()
for{//主协程阻塞
}
}
结果
主协程阻塞,管道阻塞当num++后,才能打印
管道关闭用close(管道名称)