MST

星途 面试题库

面试题:Go中select语句如何处理多个通道的并发调度

请描述Go语言中select语句在面对多个通道操作时(如读、写操作),是如何进行并发调度的,并且举例说明如何利用select实现一个简单的多路复用场景,比如同时监听多个通道的数据读取。
50.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Go语言中select语句在面对多个通道操作时的并发调度机制

  1. 随机选择:当select语句中有多个case语句可以执行(例如多个通道准备好读或写)时,Go运行时会随机选择其中一个case来执行。这确保了没有一个case会被饥饿(始终得不到执行机会)。
  2. 阻塞等待:如果没有任何case可以立即执行,select语句会阻塞,直到至少有一个case可以执行。
  3. 默认分支:如果存在default分支,当没有其他case可以立即执行时,default分支会立即执行,而不会阻塞。

利用select实现简单多路复用场景示例

package main

import (
    "fmt"
)

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() {
        ch1 <- 10
    }()

    go func() {
        ch2 <- 20
    }()

    select {
    case data := <-ch1:
        fmt.Println("Received from ch1:", data)
    case data := <-ch2:
        fmt.Println("Received from ch2:", data)
    }
}

在上述示例中,我们创建了两个通道ch1ch2,并在两个独立的goroutine中向通道发送数据。select语句同时监听这两个通道,哪个通道先准备好接收数据,对应的case就会被执行。由于两个goroutine向通道发送数据的时间不确定,select会随机选择先准备好的通道执行。