协程
意义
线程和进程最多创建上万个,而协程最多可以几百万个,因为它很轻量。
同步
进程和线程是通过Mutex实现的,协程是通过channel实现的。
##注意
chan int 也是一种类型
例如 make (chan int)
例如 ch chan int
例如 x := chan int
CODE
运行协程
package main
import (
"fmt"
"time"
)
func Add(x, y int){
z := x + y
fmt.Println(z)
}
func main(){
for i := 0; i < 10; i++{
go Add(i, i)
}
// 执行函数
chs := make ([] chan int, 10)
for i := 0; i < 10; i++{
go Add(i, i)
}
// 等待执行完毕
time.Sleep(100)
fmt.Println("end")
}
有channel交换的协程
package main
import (
"fmt"
// "time"
)
func Read(ch chan int){
x := <-ch
fmt.Println(x)
}
func Write(ch chan int){
//ch <- 10
}
func main(){
// 执行函数
ch := make (chan int)
go Read(ch)
go Write(ch)
// 检测是否执行完毕
time.Sleep(100)
fmt.Println("end")
}
利用channel精确判断是否执行完毕
package main
import (
"fmt"
// "time"
)
func Add(x, y int, flag chan int){
z := x + y
fmt.Println(z)
flag <- 1 // 每次协程函数执行完毕后,置位flag
}
func main(){
// 执行函数
chs := make ([] chan int, 10) // make 数组每个元素的初值flag为10
for i := 0; i < 10; i++{
chs[i] = make (chan int) // make每一个元素为chan类型
go Add(i, i, chs[i])
}
// 检测是否执行完毕
for i := 0; i < 10; i++{
<-chs[i]
}
fmt.Println("end")
}