Go基础系列(指定goroutine的执行顺序)
Go channel系列:
- channel入门
- 为select设置超时时间
- nil channel用法示例
- 双层channel用法示例
- 指定goroutine的执行顺序
如果一个goroutine A依赖于另一个goroutine B,在goroutine A中首先通过读goroutine B来阻塞自己,直到goroutine B关闭自身之后,goroutine A才会继续运行。这样,goroutine B就先于goroutine A运行。
下面是一个指定goroutine执行顺序的示例,它保证的顺序是
A()-->B()-->C()
。package mainimport (
"fmt"
"time"
)// A首先被a阻塞,A()结束后关闭b,使b可读
func A(a, b chan struct{}) {
<-a
fmt.Println("A()!")
time.Sleep(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{})go C(z)
go A(x, y)
go C(z)
go B(y, z)
go C(z)// 关闭x,让x可读
close(x)
time.Sleep(3 * time.Second)
}
上面的示例中:A goroutine被x阻塞,B goroutine被y阻塞,C goroutine被z阻塞。C依赖的z由B关闭,B依赖的y由A关闭。
如此一来,当main goroutine中的x被关闭后,A()从阻塞中释放,继续执行,关闭y,然后B从阻塞中释放,继续执行,关闭z,C得以释放。由于z被关闭后,z仍然可读,所以多次执行C(z)不会出问题。
A()和B()不能多次执行,因为close()不能操作已被关闭的channel。
【Go基础系列(指定goroutine的执行顺序)】注意,上面的channel都是
struct{}
类型的,整个过程中,x、y、z这3个通道都没有传递数据,而是直接关闭来释放通道,让某些阻塞的goroutine继续执行下去。显然,这里的x、y、z的作用都是"信号通道",用来传递消息。推荐阅读
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- 【欢喜是你·三宅系列①】⑶
- Python基础|Python基础 - 练习1
- 你不可不知的真相系列之科学
- 人脸识别|【人脸识别系列】| 实现自动化妆
- Java|Java基础——数组
- Java基础-高级特性-枚举实现状态机
- Android|Android install 多个设备时指定设备
- 营养基础学20180331(课间随笔)??
- 分享!如何分分钟实现微信扫二维码调用外部浏览器打开指定页面的功能