Golang中如何控制goroutine的执行顺序?

发布时间 2023-06-07 14:44:10作者: 99号的格调

首先说明一下原理:前后协程之间通过通道去相互限制,后一个线程尝试去获取一个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按照顺序执行,如果有更好的方法,欢迎评论区交流!!!