package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int, 2)
defer close(c)
//提前将队列放满
c <- 1
c <- 2
fmt.Println("开始尝试执行")
go cross(c)
process(c)
}
func process(c chan int) {
fmt.Println("被限流阻塞")
c <- 1 //channel已满,将阻塞,直到成功放入channel **
fmt.Println("已放行,执行process")
}
func cross(c chan int) {
a := 1
b := 3
for b >= a {
fmt.Println("阻塞", b, "秒")
time.Sleep(time.Second)
b -= 1
}
fmt.Println("释放一个通行证")
<-c //取出元素,则chan可以继续放入数据,将唤醒**行代码
}

本文探讨了Go语言中通道(channel)的限流与阻塞机制,通过实例演示了如何使用通道实现任务限流,以及如何在通道满载时进行阻塞等待。了解这些机制对于掌握Go并发编程至关重要。
647

被折叠的 条评论
为什么被折叠?



