MST

星途 面试题库

面试题:Go 中基于 Select 多路复用的并发设计

假设你有多个不同类型的通道,分别用于接收用户请求、系统状态更新和定时任务的信号。请使用 `select` 语句实现一个并发处理逻辑,确保能及时响应不同通道的事件,并处理好通道关闭和超时的情况。
48.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

以下是使用Go语言实现的示例代码:

package main

import (
	"fmt"
	"time"
)

func main() {
	userRequestCh := make(chan string)
	systemStatusCh := make(chan string)
	timedTaskCh := make(chan string)

	// 模拟向通道发送数据
	go func() {
		time.Sleep(2 * time.Second)
		userRequestCh <- "User request received"
	}()
	go func() {
		time.Sleep(3 * time.Second)
		systemStatusCh <- "System status updated"
	}()
	go func() {
		time.Sleep(1 * time.Second)
		timedTaskCh <- "Timed task signal"
	}()

	timeout := time.After(5 * time.Second)

	for {
		select {
		case req := <-userRequestCh:
			fmt.Println("处理用户请求:", req)
		case status := <-systemStatusCh:
			fmt.Println("处理系统状态更新:", status)
		case task := <-timedTaskCh:
			fmt.Println("处理定时任务信号:", task)
		case <-timeout:
			fmt.Println("操作超时")
			return
		}
	}
}

在上述代码中:

  1. 定义了三个不同类型的通道 userRequestChsystemStatusChtimedTaskCh 分别用于接收用户请求、系统状态更新和定时任务的信号。
  2. 使用 go 协程模拟向通道发送数据。
  3. 定义了一个 timeout 通道,用于设置超时时间为5秒。
  4. select 语句中,监听这三个通道和 timeout 通道,当任意通道有数据到来时,相应的分支会被执行,处理对应的事件。如果超过5秒没有任何通道接收到数据,timeout 分支会被执行,程序结束。

注意,在实际应用中,需要根据具体需求调整通道的类型、发送和接收逻辑以及超时时间等。