MST

星途 面试题库

面试题:Go语言控制结构在并发场景下对性能的影响及优化

假设有多个goroutine并发处理任务,每个任务需要从共享的任务队列中获取任务并处理。请使用Go语言编写代码实现此场景,且代码需运用合适的控制结构(如select语句等)来确保性能最优,同时说明这些控制结构在并发场景下是如何影响性能的。
25.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func worker(id int, taskQueue <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for task := range taskQueue {
        fmt.Printf("Worker %d is processing task %d\n", id, task)
    }
}

func main() {
    const numWorkers = 3
    var wg sync.WaitGroup
    taskQueue := make(chan int)

    for i := 0; i < numWorkers; i++ {
        wg.Add(1)
        go worker(i, taskQueue, &wg)
    }

    for i := 1; i <= 10; i++ {
        taskQueue <- i
    }
    close(taskQueue)

    wg.Wait()
}

控制结构对性能的影响

  1. for... range 循环:在 worker 函数中,for task := range taskQueue 这种形式会不断从 taskQueue 通道中接收数据,直到通道关闭。这保证了所有的任务都被处理,同时在通道为空时,worker 会阻塞等待新任务,避免了不必要的CPU空转,从而提高了性能。
  2. select 语句(虽然本题代码中未直接使用,但类似场景会涉及):在更复杂的并发场景中,select 语句可以同时监听多个通道的操作(接收或发送)。例如,除了任务通道,可能还有一个控制通道用于发送停止信号。select 语句会阻塞直到其中一个通道操作准备就绪。如果多个通道同时准备好,会随机选择一个执行。这种机制使得 goroutine 可以高效地处理多个异步事件,避免在等待单一通道时浪费CPU资源,提高了并发程序的整体性能。在有多个 goroutine 竞争任务的场景下,select 语句结合通道可以实现公平且高效的任务分配。