MST

星途 面试题库

面试题:Go语言中有缓冲通道在并发任务分发场景的应用

在一个需要处理大量并发任务的Go程序中,比如有1000个独立的计算任务,每个任务是对一个数字进行平方运算并返回结果。请使用有缓冲通道设计一个任务分发和结果收集的模型,阐述你的设计思路并给出核心代码示例。
42.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 任务分发:使用一个带缓冲的通道来存放任务。可以将1000个数字依次发送到这个通道中,供工作协程获取任务。
  2. 工作协程:启动多个工作协程,每个工作协程从任务通道中获取任务,执行平方运算,并将结果发送到结果通道。
  3. 结果收集:使用另一个带缓冲的通道来收集工作协程返回的结果。主协程从这个结果通道中获取并处理最终结果。

核心代码示例

package main

import (
    "fmt"
)

func worker(taskChan <-chan int, resultChan chan<- int) {
    for num := range taskChan {
        result := num * num
        resultChan <- result
    }
    close(resultChan)
}

func main() {
    const taskCount = 1000
    taskChan := make(chan int, taskCount)
    resultChan := make(chan int, taskCount)

    // 启动工作协程
    const workerCount = 10
    for i := 0; i < workerCount; i++ {
        go worker(taskChan, resultChan)
    }

    // 分发任务
    for i := 1; i <= taskCount; i++ {
        taskChan <- i
    }
    close(taskChan)

    // 收集结果
    var results []int
    for result := range resultChan {
        results = append(results, result)
    }

    // 处理结果
    for _, res := range results {
        fmt.Println(res)
    }
}