MST

星途 面试题库

面试题:Go语言通道在高并发场景下的资源管理策略

在一个高并发的Web服务场景中,需要处理大量的请求,每个请求会启动一个goroutine来处理。为了避免资源耗尽,需要对同时运行的goroutine数量进行限制。请使用通道设计一个方案,有效管理这些goroutine的数量,并且在处理完所有请求后优雅关闭。
30.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for job := range jobs {
        fmt.Printf("Worker %d started job %d\n", id, job)
        // 模拟实际工作
        fmt.Printf("Worker %d finished job %d\n", id, job)
    }
}

func main() {
    const maxGoroutines = 3
    jobs := make(chan int, 10)
    var wg sync.WaitGroup

    // 启动goroutine池
    for i := 1; i <= maxGoroutines; i++ {
        wg.Add(1)
        go worker(i, jobs, &wg)
    }

    // 提交任务
    for j := 1; j <= 10; j++ {
        jobs <- j
    }
    close(jobs)

    // 等待所有任务完成
    wg.Wait()
}
  1. 原理
    • 首先定义了一个 worker 函数,该函数从 jobs 通道中接收任务并处理。
    • main 函数中,创建了一个带有缓冲区的 jobs 通道来传递任务,并且创建了一个 sync.WaitGroup 来等待所有任务完成。
    • 通过 for 循环启动固定数量(maxGoroutines)的 goroutine 作为工作池,每个 goroutine 都会调用 worker 函数处理任务。
    • 然后向 jobs 通道发送任务,发送完成后关闭 jobs 通道。这会使得 worker 函数中的 for... range 循环结束,从而优雅地关闭所有 goroutine
    • 最后调用 wg.Wait() 等待所有 goroutine 完成任务。