Golang中如何控制goroutine的执行顺序?
首先说明一下原理:前后协程之间通过通道去相互限制,后一个线程尝试去获取一个channel的值,当channel中没有值时,就会一直阻塞,而前一个协程则负责关闭channel,当前一个协程完成了这个操作,后一个协程才可以结束阻塞,继续执行。
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
newChan1 := make(chan int)
newChan2 := make(chan int)
newChan3 := make(chan int)
go func() {
fmt.Println("goroutine 1")
close(newChan1)
}()
go func() {
<-newChan1
fmt.Println("goroutine 2")
close(newChan2)
}()
go func() {
<-newChan2
fmt.Println("goroutine 3")
close(newChan3)
}()
time.Sleep(time.Second)
}
输出结果:
示例代码中,我们开启了三个协程,初始化了三个channel,每一个goroutine尝试获取前一个channel里的元素,然后当前goroutine则关闭这个channel,让后面的去读这个gouroutine,因为go语言允许读一个关闭的channel的,所以我们可以利用这个特性来使goroutine按照顺序执行,如果有更好的方法,欢迎评论区交流!!!