【golang】使用select {}

简介: 【golang】使用select {}

场景

有时我们需要让应用不退出,在后台一直运行着。

永远阻塞的作用在哪里呢? 当我们开发一个程序的时候,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{}

目录
相关文章
|
6月前
|
程序员 Go
Golang深入浅出之-Select语句在Go并发编程中的应用
【4月更文挑战第23天】Go语言中的`select`语句是并发编程的关键,用于协调多个通道的读写。它会阻塞直到某个通道操作可行,执行对应的代码块。常见问题包括忘记初始化通道、死锁和忽视`default`分支。要解决这些问题,需确保通道初始化、避免死锁并添加`default`分支以处理无数据可用的情况。理解并妥善处理这些问题能帮助编写更高效、健壮的并发程序。结合使用`context.Context`和定时器等工具,可提升`select`的灵活性和可控性。
106 2
|
3月前
|
监控 Go
|
3月前
|
Go 开发者
|
5月前
|
监控 Go
博客园 ☜ golang select 的 case 执行顺序
Go 语言的 `select` 语句用于等待多个通道操作就绪。当非阻塞的 chan1, chan2, chan3 同时可读时,`select` 会随机选择一个执行,之后的循环中其他未选中的 case 仍有执行机会。如果所有 case 都未准备好,将执行 default case。
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
155 1
|
6月前
|
存储 算法 Java
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
82 0
|
缓存 Go C++
Golang中select的四大用法
Golang中select的四大用法
111 0
|
Linux Go C++
golang select 机制和超时
golang select 机制和超时
113 0
|
Linux Go
学习golang(12) 初探:协程(3)多个chan之select选择器
学习golang(12) 初探:协程(3)多个chan之select选择器
234 0
|
存储 Go
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
507 0