北京列举网 > 教育培训 > 电脑/网络 > 拉勾教育Go基础系列指定goroutine的执行顺序
北京
[切换城市]

拉勾教育Go基础系列指定goroutine的执行顺序

更新时间:2020-12-02 13:55:37 浏览次数:97次
区域: 北京 > 海淀 > 中关村
类别:软件工程师培训
地址:创业大街
Go channel系列:
•      channel入门
•      为select设置超时时间
•      nil channel用法示例
•      双层channel用法示例
•      指定goroutine的执行顺序
当关闭一个channel时,会使得这个channel变得可读。通过这个特性,可以实现一个goroutine执行顺序的技巧。拉勾IT课小编为大家分解
如果一个goroutine A依赖于另一个goroutine B,在goroutine A中首先通过读goroutine B来阻塞自己,直到goroutine B关闭自身之后,goroutine A才会继续运行。这样,goroutine B就先于goroutine A运行。
下面是一个指定goroutine执行顺序的示例,它保证的顺序是A()-->B()-->C()。
package main

import (
     "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。
注意,上面的channel都是struct{}类型的,整个过程中,x、y、z这3个通道都没有传递数据,而是直接关闭来释放通道,让某些阻塞的goroutine继续执行下去。显然,这里的x、y、z的作用都是"信号通道",用传递消息

北京电脑/网络相关信息
4月23日
办公软件培训
平谷-平谷城区
4月19日
办公软件培训
平谷-平谷城区
4月11日
办公软件培训
平谷-平谷城区
4月9日
办公软件培训
平谷-平谷城区
4月7日
4月1日
注册时间:2020年08月20日
UID:706755
---------- 认证信息 ----------
手机已认证
查看用户主页