场景
有时我们需要让应用不退出,在后台一直运行着。
永远阻塞的作用在哪里呢? 当我们开发一个程序的时候,main函数千万不能在子协程干完活前退出,不然所有的子协程就都被迫退出了。服务也就被迫停止了。
一般会使用 channel,这里介绍下 select{}
代码
func main() { for i := 0; i < 10; i++ { //启动20个协程处理消息队列中的消息 c := consumer.New() go c.Start() } select {} // 阻塞 }
讲解
select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。
select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。
package main import "fmt" func main() { ch1 := make(chan int, 1) ch2 := make(chan int, 1) ch1 <- 1 ch2 <- 1 select { case <-ch1: fmt.Println("ch1 pop one element") case <-ch2: fmt.Println("ch2 pop one element") /* 你可以定义任意数量的 case */ default: /* 可选 */ fmt.Println("default! ") } }
无限循环
select{}