记录goroutine相关用法
在golang中使用goroutine很简单,通过go 关键字即可使用,例如:
func C(a chan struct{}){
<- a
fmt.Println("C()!")
}
其实多个goroutine执行是无序的,要想他们以一定的顺序执行,可以通过channel(使用 chan关键词)来规划他们。
完整案例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)
}
运行结果:
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)
}
运行结果:
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,运行就变得可控了。