记录goroutine相关用法
复制代码
在golang中使用goroutine很简单,经过go 关键字便可使用,例如:golang
func C(a chan struct{}){
<- a
fmt.Println("C()!")
}
复制代码
其实多个goroutine执行是无序的,要想他们以必定的顺序执行,能够经过channel(使用 chan关键词)来规划他们。bash
完整案例1
package main
import (
"fmt"
"time"
)
func main(){
testrun := true
f := func() {
for testrun{
fmt.Println("sub proc running ...")
time.Sleep(1 * time.Second)
}
fmt.Println("sub proc exit")
}
go f()
go f()
go f()
time.Sleep(2 * time.Second)
testrun = false
time.Sleep(3 * time.Second)
fmt.Println("main proc exit")
go fmt.Println(1)
go fmt.Println(2)
go fmt.Println(3)
fmt.Println("main goroutine finished!")
time.Sleep(1 *time.Second)
}
复制代码
运行结果:ui
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc running ...
sub proc exit
sub proc exit
sub proc exit
main proc exit
main goroutine finished!
2
1
3
Process finished with exit code 0
复制代码
完整案例2
package main
import (
"fmt"
"time"
)
// A先被a阻塞,A()结束后关闭b,使b可读
func A(a,b chan struct{}){
<- a
fmt.Println("A()!")
time.Sleep(1 * time.Second)
close(b)
}
//B首先被a阻塞,B()结束后关闭b,使b可读
func B(a,b chan struct{}){
<-a
fmt.Println("B()!")
close(b)
}
//C首先被a阻塞
func C(a chan struct{}){
<- a
fmt.Println("C()!")
}
func main(){
x := make(chan struct{})
y := make(chan struct{})
z := make(chan struct{})
fmt.Println("C:z")
go C(z)
fmt.Println("A:x,y")
go A(x,y)
fmt.Println("C:z")
go C(z)
fmt.Println("B: y,z")
go B(y,z)
fmt.Println("C:z")
go C(z)
close(x)
time.Sleep(3 * time.Second)
}
复制代码
运行结果:spa
C:z
A:x,y
C:z
B: y,z
C:z
A()!
B()!
C()!
C()!
C()!
Process finished with exit code 0
复制代码
经过两个案例,能够看出没有使用chan,运行是无序的,当使用了chan,运行就变得可控了。code